/ Hex Artifact Content
Login

Artifact b4457526cee73c0b69fad42f799f619b1d5a8a8a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0210: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0220: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0230: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0240: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0250: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
0260: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0270: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
0280: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
0290: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
02a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
02b0: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
02c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
02d0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
02e0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
02f0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
0300: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
0310: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0320: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0330: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0340: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
0350: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
0360: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
0370: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
0380: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
0390: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
03a0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
03b0: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
03c0: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
03d0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
03e0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
03f0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
0400: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
0410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0430: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0440: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0450: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0460: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
0470: 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
0480: 73 65 20 6f 66 20 71 75 65 72 79 20 69 73 20 62  se of query is b
0490: 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74  eing coded..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
04b0: 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73  rtCtx SortCtx;.s
04c0: 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a  truct SortCtx {.
04d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
04e0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
04f0: 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
0500: 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a  P BY clause) */.
0510: 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20    int nOBSat;   
0520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0530: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
0540: 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
0550: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0560: 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20  t iECursor;     
0570: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0580: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72  mber for the sor
0590: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
05a0: 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f  Return;        /
05b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
05c0: 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  ng block-output 
05d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a  return address *
05e0: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f  /.  int labelBkO
05f0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ut;       /* Sta
0600: 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  rt label for the
0610: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75   block-output su
0620: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
0630: 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
0640: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
0650: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  f the OP_SorterO
0660: 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70  pen or OP_OpenEp
0670: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75 38 20  hemeral */.  u8 
0680: 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20  sortFlags;      
0690: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
06a0: 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69  re SORTFLAG_* bi
06b0: 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  ts */.};.#define
06c0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
06d0: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
06e0: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
06f0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0700: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0710: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0730: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0740: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0750: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0760: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
0770: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
0780: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
0790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
07a0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
07b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
07c0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
07d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
07e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
07f0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0810: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0820: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0830: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0850: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0860: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
0870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0880: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
0890: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
08a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
08b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
08c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
08d0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
08e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
08f0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0900: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  .  sqlite3WithDe
0910: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74  lete(db, p->pWit
0920: 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  h);.}../*.** Ini
0930: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0940: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0960: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0970: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0980: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0990: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
09a0: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
09b0: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
09c0: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
09d0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
09e0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
09f0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0a00: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0a10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0a20: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0a30: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0a50: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0a60: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0a70: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0ab0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0ac0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0ad0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0ae0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0af0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0b00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0b20: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0b30: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0b40: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0b50: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0b60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0b70: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0b80: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0b90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0ba0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0bb0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0bc0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0bd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0be0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0bf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0c00: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0c10: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0c20: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0c30: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0c40: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0c50: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0c60: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0c70: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0c80: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0c90: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0ca0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0cb0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0cc0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0cd0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0ce0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0cf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0d10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0d20: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
0d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
0d50: 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d  !pOffset || pLim
0d60: 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20  it ); /* OFFSET 
0d70: 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f  implies LIMIT */
0d80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
0da0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0db0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74  ;.    pNew = &st
0dc0: 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65  andin;.    memse
0dd0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
0de0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20  f(*pNew));.  }. 
0df0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
0e00: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
0e30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54  sqlite3Expr(db,T
0e40: 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20  K_ALL,0));.  }. 
0e50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0e60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 53  pEList;.  if( pS
0e70: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
0e80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0e90: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ea0: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
0eb0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
0ec0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0ed0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
0ee0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0f00: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0f10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0f20: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0f30: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c  ->selFlags = sel
0f40: 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6f  Flags;.  pNew->o
0f50: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
0f60: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0f70: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0f80: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0f90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66  t;.  assert( pOf
0fa0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69  fset==0 || pLimi
0fb0: 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  t!=0 );.  pNew->
0fc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0fd0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0fe0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0ff0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1010: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
1020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
1030: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1050: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1060: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
1070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1080: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
1090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
10a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
10c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10e0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
10f0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1100: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1110: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1120: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1130: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1140: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1150: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
1160: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
1170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1180: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
1190: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
11d0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
11e0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
11f0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
1200: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
1210: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
1220: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1230: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1240: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1250: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1260: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1270: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1280: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1290: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
12b0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
12c0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
12d0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
12e0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
12f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
1300: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
1310: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
1320: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1330: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1340: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1350: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1360: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1370: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1380: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1390: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
13a0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
13b0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
13c0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
13d0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
13e0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
13f0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1400: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1420: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1440: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1450: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1460: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1470: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1480: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1490: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
14c0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
14d0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
14e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14f0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1500: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1510: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1520: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1540: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1550: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1560: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1570: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1580: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1590: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
15a0: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
15b0: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
15c0: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
15d0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
15e0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
15f0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1600: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1610: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1620: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1630: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1640: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1650: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1660: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1670: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1680: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1690: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
16a0: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
16b0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
16c0: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
16d0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
16e0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
16f0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1700: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1710: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1720: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1740: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1750: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1760: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1770: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1780: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1790: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
17a0: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
17b0: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
17c0: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
17d0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
17e0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
17f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1800: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1810: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1820: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1830: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1840: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1850: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1860: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1870: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1880: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1890: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
18a0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
18b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
18e0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
18f0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1900: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1910: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1920: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1930: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1940: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1950: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1970: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1980: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1990: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
19a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
19b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
19c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
19d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19e0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
19f0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1a00: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1a10: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a30: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1a40: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1a50: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1a60: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1a70: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1a80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1a90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1aa0: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1ab0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ac0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1ad0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ae0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1af0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1b00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b10: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1b20: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1b30: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1b40: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1b50: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1b60: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1b80: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1b90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1ba0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1bb0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1bc0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1bd0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1be0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c00: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1c10: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1c20: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1c30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1c70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1c90: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1ca0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1cb0: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1cc0: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1cd0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1ce0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1cf0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1d00: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1d10: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1d20: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1d30: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
1d40: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
1d50: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
1d60: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
1d70: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
1d80: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
1d90: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1da0: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1db0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1dc0: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1dd0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1de0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1e00: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1e10: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e30: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1e40: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
1e50: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1e70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1e80: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
1e90: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1ea0: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1eb0: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1ec0: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1ee0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1ef0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f00: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1f10: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f50: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
1f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
1f90: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1fa0: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1fb0: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1fc0: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1fd0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1fe0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ff0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
2000: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
2010: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
2020: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2030: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2040: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2050: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2060: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20c0: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
20d0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
20e0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
20f0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2100: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
2110: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2120: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2130: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2140: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2150: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2160: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2170: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2180: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2190: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
21a0: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
21b0: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
21c0: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
21d0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
21e0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
21f0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
2200: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
2210: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
2220: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2230: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2240: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2250: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2280: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2290: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
22c0: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
22d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
22e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2300: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
2310: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
2320: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2340: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2350: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2360: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2370: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
23a0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
23b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
23c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
23e0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
23f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2400: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2420: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2430: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2440: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2480: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
24b0: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
24c0: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
24d0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
24e0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
24f0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2500: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2510: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2520: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2530: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2540: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2550: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2560: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2570: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2580: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2590: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
25a0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
25b0: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
25c0: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
25d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25e0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
25f0: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2600: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2610: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2620: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2630: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2650: 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  asProperty(pEq, 
2660: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2670: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2680: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2690: 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64  ty(pEq, EP_NoRed
26a0: 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69  uce);.    pEq->i
26b0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
26c0: 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c   (i16)pE2->iTabl
26d0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72  e;.  }.  *ppWher
26e0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26f0: 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c  nd(db, *ppWhere,
2700: 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pEq);.}../*.** 
2710: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
2720: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
2730: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2740: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2750: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
2760: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2770: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
2780: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2790: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
27a0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
27b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
27c0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
27d0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
27e0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
27f0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
2800: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
2810: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
2820: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
2830: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
2840: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
2850: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2860: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
2870: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
2880: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
2890: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
28a0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
28b0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
28c0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
28d0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
28e0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
28f0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
2900: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
2910: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
2920: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2930: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
2940: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2950: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
2960: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2970: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
2980: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2990: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
29a0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
29b0: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
29c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
29d0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
29e0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
29f0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
2a00: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
2a10: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
2a20: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2a30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2a40: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2a50: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
2a60: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
2a70: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
2a80: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
2a90: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
2aa0: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
2ab0: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
2ac0: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
2ad0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
2ae0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
2af0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
2b00: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
2b10: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
2b20: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2b30: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2b40: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2b50: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2b60: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2b70: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2b80: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2b90: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2ba0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2bb0: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2bc0: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
2bd0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
2be0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2bf0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
2c00: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
2c10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
2c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2c30: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2c60: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2c70: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2c80: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
2c90: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2cb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2cc0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2cd0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2ce0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2d00: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2d10: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2d20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d40: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2d50: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2d60: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2d70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2d80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2d90: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2da0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2db0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2dd0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2de0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2df0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2e00: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2e10: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2e20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2e30: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2e40: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2e50: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2e60: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2e70: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2e80: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2e90: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2ea0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2eb0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2ec0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2ed0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2ee0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2ef0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2f00: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2f10: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2f20: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2f30: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2f40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2f50: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2f60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2f70: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2f80: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2f90: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2fa0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2fb0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2fd0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3000: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3010: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3020: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3040: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3060: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3070: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3080: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3090: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
30b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
30c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
30d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
30e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
30f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3100: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3120: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3130: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3140: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3150: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3160: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3170: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3180: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3190: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
31a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
31b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
31c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
31d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
31e0: 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  = (pRight->joint
31f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3200: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3210: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3220: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3230: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3240: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3250: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3270: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3280: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3290: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
32a0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
32b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
32c0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
32d0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
32e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
32f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3300: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3310: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3320: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3360: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3370: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
33a0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
33b0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
33c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
33d0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
33e0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
33f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3400: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3410: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3420: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3440: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3470: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3480: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3490: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
34a0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
34b0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
34c0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
34d0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
34e0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3500: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3510: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3530: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3540: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3550: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3560: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3570: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3580: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3590: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
35a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35b0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
35c0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
35d0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
35e0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
35f0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3620: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3630: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3640: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3650: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3660: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3680: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3690: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
36a0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
36b0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
36c0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
36d0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
36e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
36f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3700: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3710: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3720: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3730: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3740: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3750: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3760: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3770: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3780: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3790: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
37a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
37b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
37c0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
37d0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
37e0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
37f0: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3800: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3810: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3820: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3830: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3840: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3850: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3860: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3870: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3880: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3890: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
38a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
38b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
38c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
38d0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
38e0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
38f0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3900: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3910: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3920: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3970: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3980: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3990: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
39a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
39b0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
39c0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
39d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
39e0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
39f0: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3a00: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3a10: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3a20: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3a30: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3a40: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3a80: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3a90: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3aa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3ab0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3ac0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3ad0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3ae0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3af0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3b00: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3b30: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3b40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3b50: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3b60: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3b70: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3b80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3bc0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3bd0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3be0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3c10: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3c40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3c50: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3c60: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3c70: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3c80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3c90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3ca0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3cb0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
3cc0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
3cd0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
3ce0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
3cf0: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
3d00: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
3d10: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
3d20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
3d30: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
3d40: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3d50: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3d60: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
3d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
3d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
3da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
3db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
3dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
3dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
3df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
3e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
3e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
3e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
3e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
3ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
3ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3f20: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
3f30: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
3f40: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
3f50: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
3f60: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
3f70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
3f80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
3fc0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
3fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
3fe0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
3ff0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4000: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4010: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4030: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4040: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4050: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4060: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4070: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4080: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4090: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
40a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
40b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
40c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
40f0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4100: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4110: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4120: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4130: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4140: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4150: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4160: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4180: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4190: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
41a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
41d0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
41e0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
41f0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4200: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4210: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =1 );.  if( nPre
4220: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4230: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4240: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4250: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4260: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4270: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4280: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
42a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
42b0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
42c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
42d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
42e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
42f0: 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45   regBase, SQLITE
4300: 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66  _ECEL_DUP);.  if
4310: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
4320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4330: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
4340: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4350: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
4370: 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ixReg==0 ){.    
4380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4390: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  3(v, OP_Move, re
43a0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
43b0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
43c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
43d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
43e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
43f0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4400: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4410: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4420: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4430: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4440: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4450: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4460: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4470: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4480: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4490: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
44a0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
44b0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
44c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
44d0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
44e0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4500: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4510: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4520: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4550: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4560: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4570: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4580: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4590: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
45a0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
45b0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
45c0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
45d0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
45e0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
45f0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4600: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4610: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4620: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4630: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4650: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4660: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4670: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4680: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
46b0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
46c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
46d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
46e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4700: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4710: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4720: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4730: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4740: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4750: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4760: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4780: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4790: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
47a0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
47b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
47c0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
47d0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
47e0: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
47f0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4800: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4810: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4820: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4830: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4840: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4850: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4860: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4870: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4880: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4890: 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20   nOBSat, 1);.   
48a0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
48b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
48c0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
48d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
48e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
48f0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4910: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4920: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4930: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4940: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4950: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4960: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4980: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4990: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
49a0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
49c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
49d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
49e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4a00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
4a10: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4a30: 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73 65 2c  P_Move, regBase,
4a40: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4a50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4a90: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4aa0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4ab0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4ac0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4ae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b00: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4b10: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4b20: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4b30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4b50: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4b60: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4b70: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4b80: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4b90: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4ba0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4bc0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4bd0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4be0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c00: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4c10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4c40: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4c50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4c70: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4c80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c90: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4cb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4cc0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4cf0: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4d00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4d10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d20: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4d40: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4d50: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4d60: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4d70: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4d90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4db0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4dc0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4dd0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4de0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
4df0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
4e00: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
4e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
4e20: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
4e30: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
4e40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
4e50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
4e70: 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c  Neg, iOffset, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4eb0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
4ec0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
4ed0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
4ee0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
4ef0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
4f00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4f10: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
4f20: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
4f30: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
4f40: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
4f50: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
4f60: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
4f70: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
4f80: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4f90: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4fa0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4fb0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4fc0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4fd0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4fe0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4ff0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5000: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5010: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5020: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5030: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5040: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5050: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5060: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5070: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5080: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5090: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
50a0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
50b0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
50c0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
50d0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
50e0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
50f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5100: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5110: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5120: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5130: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5140: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5150: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5160: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5170: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5190: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
51a0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
51b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
51c0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
51d0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
51e0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
51f0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5200: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5210: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5230: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5240: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5250: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5260: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5280: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5290: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52b0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
52c0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
52d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
52e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
52f0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
5300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5310: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
5320: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
5330: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
5340: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5350: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5360: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5370: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5380: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
5390: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
53a0: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
53b0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
53c0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
53d0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
53e0: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
53f0: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
5400: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
5410: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
5420: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
5430: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
5440: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5450: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5460: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5480: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
5490: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
54a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
54b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
54c0: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
54d0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
54e0: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
54f0: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
5500: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
5510: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
5520: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
5530: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
5540: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5550: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5560: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5570: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5580: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
5590: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
55a0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
55b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
55c0: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
55d0: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
55e0: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
55f0: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
5600: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5610: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
5620: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5640: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5660: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5670: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5680: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5690: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
56a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
56b0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
56c0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
56d0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
56e0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
56f0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
5700: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
5710: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
5720: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
5730: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
5740: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5750: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5760: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5770: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5780: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
5790: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
57a0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
57b0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
57c0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
57d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
57e0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
57f0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5800: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5810: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5820: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5830: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5840: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5850: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5860: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5870: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5880: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
58a0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
58b0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
58c0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
58d0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
58e0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
58f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5900: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5910: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5920: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5930: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5940: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5950: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5960: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5970: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5980: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5990: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
59a0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
59b0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
59c0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
59d0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
59e0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
59f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5a00: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5a10: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5a20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5a30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5a40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5a50: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5a70: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5a80: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5a90: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5ac0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5ad0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5ae0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5af0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
5b00: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
5b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5b20: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
5b30: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
5b40: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5b50: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5b60: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b80: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5b90: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
5ba0: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
5bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bc0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
5bd0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
5be0: 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  lt */..  assert(
5bf0: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
5c00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
5c10: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
5c20: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
5c30: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
5c40: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
5c50: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
5c60: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
5c70: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
5c80: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
5c90: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
5ca0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
5cb0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
5cc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
5cd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
5ce0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
5cf0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
5d00: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
5d10: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
5d20: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5d30: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
5d40: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
5d50: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
5d60: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
5d70: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5d80: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
5d90: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
5da0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5db0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
5dc0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
5dd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5de0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
5df0: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
5e00: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
5e10: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
5e30: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
5e40: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5e50: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5e70: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5e80: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5e90: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5ea0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5eb0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5ec0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5ed0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5ee0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5ef0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5f00: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5f10: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5f20: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5f30: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5f40: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5f50: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5f60: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5f70: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5f80: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5f90: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5fa0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5fb0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5fc0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5fd0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ff0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6000: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6010: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6020: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
6030: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6040: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6050: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6060: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6070: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6080: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6090: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
60a0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
60b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
60c0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
60d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
60e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
60f0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
6100: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
6110: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6120: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
6130: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
6140: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
6150: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
6160: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
6170: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
6180: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
6190: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
61a0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
61b0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
61c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
61d0: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
61e0: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
61f0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
6200: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
6210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6220: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6230: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6240: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6250: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6260: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6270: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6280: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6290: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
62a0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
62b0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
62c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
62d0: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
62e0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
62f0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6300: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6310: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6320: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6330: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6340: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6350: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6370: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6380: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
6390: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
63a0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
63c0: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
63d0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
63e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
63f0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6400: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6410: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6420: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6430: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6440: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6450: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6460: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6470: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6480: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6490: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
64a0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
64b0: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
64c0: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
64d0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
64e0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
64f0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6500: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6510: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6520: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6530: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6540: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6550: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6560: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6570: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6580: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6590: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65a0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
65b0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
65c0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
65d0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
65e0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
65f0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6610: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6620: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6630: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6640: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6650: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6660: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6670: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6680: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6690: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
66a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
66b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
66c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
66d0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
66e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
66f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
6700: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
6710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6730: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
6740: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6750: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6760: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67a0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
67b0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
67c0: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
67d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
67e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
67f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6810: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6820: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6830: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
6840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6850: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6860: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6870: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6880: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
68a0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c  Addr(v)==iJump |
68b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
68c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
68f0: 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72  py, regResult, r
6900: 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43  egPrev, nResultC
6910: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ol-1);.        b
6920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6930: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6940: 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
6950: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6960: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
6970: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
6980: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
69a0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
69b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
69c0: 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ert( pDistinct->
69d0: 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
69e0: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
69f0: 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63  RED );.        c
6a00: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
6a10: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74  se, pDistinct->t
6a20: 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  abTnct, iContinu
6a30: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  e, nResultCol, r
6a40: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6a60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6a70: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6a80: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6a90: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6aa0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6ab0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6ac0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6ad0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6ae0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6af0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6b00: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6b10: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6b20: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6b40: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6b50: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6b60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6b70: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6b80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6b90: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6bb0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6bc0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6bd0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6c00: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6c20: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c30: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6c50: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6c60: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6c70: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6c80: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6c90: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6ca0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6cb0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6cc0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6cd0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ce0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
6cf0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
6d00: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
6d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6d20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d30: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
6d40: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
6d50: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6d70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6d80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6d90: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
6da0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
6db0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
6dc0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
6dd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6de0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
6df0: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
6e00: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
6e10: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
6e20: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
6e30: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6e40: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
6e50: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
6e60: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
6e70: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
6e80: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
6e90: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6ea0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
6eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6ec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
6ed0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
6ee0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
6ef0: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
6f00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f10: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
6f20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6f30: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
6f40: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6f50: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
6f60: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
6f70: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
6f80: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
6f90: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
6fa0: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
6fb0: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
6fc0: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
6fd0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
6fe0: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
6ff0: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
7000: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
7010: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
7020: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
7030: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
7040: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
7050: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
7060: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
7070: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
7080: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
7090: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
70a0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
70b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
70c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
70d0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
70e0: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
70f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7110: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7120: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7130: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
7140: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7160: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7170: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7180: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7190: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
71a0: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
71b0: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
71c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
71d0: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
71e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
71f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7210: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7220: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
7230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7250: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7260: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
7270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7280: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7290: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
72a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
72b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
72c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
72d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
72e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
72f0: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
7300: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7310: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7330: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
7340: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
7350: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
7360: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
7370: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
7380: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
7390: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
73a0: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
73b0: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
73c0: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
73d0: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
73e0: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
73f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7400: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7410: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
7420: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
7430: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
7440: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
7450: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
7460: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
7470: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
7480: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
7490: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
74a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
74b0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
74c0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
74d0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
74e0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
74f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
7500: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
7510: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
7520: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
7530: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
7540: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
7550: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
7560: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
7570: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
7580: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
7590: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
75a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
75b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
75c0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
75d0: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
75e0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
75f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7600: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7610: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7630: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7640: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7650: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
7660: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
7670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7680: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
7690: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
76a0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
76b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
76d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
76e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
76f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7700: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7720: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7730: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7740: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7750: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
7760: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
7770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7780: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
77a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
77b0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
77c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
77d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
77e0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
77f0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7810: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7820: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7830: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7840: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7850: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
7860: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
7870: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
7880: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
7890: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
78a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
78b0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
78c0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
78d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
78e0: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
78f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7900: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7910: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7920: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7930: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
7940: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7960: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
7970: 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  iParm );.       
7980: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
7990: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
79a0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
79b0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
79c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
79d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
7a00: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
7a10: 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20  utine:       /* 
7a20: 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63  Send data to a c
7a30: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
7a40: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
7a50: 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  : {        /* Re
7a60: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
7a70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
7a80: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
7a90: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
7aa0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ab0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
7ac0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7ae0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7af0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7b00: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b10: 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b  ol, nPrefixReg);
7b20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7b30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7b40: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
7b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b60: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7b70: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
7b80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
7bb0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
7bc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7bd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7be0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7bf0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7c00: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7c10: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7c40: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7c50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
7c60: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
7c70: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
7c80: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
7c90: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
7ca0: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
7cb0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
7cc0: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
7cd0: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
7ce0: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
7cf0: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
7d00: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
7d10: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
7d20: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
7d30: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
7d40: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
7d50: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
7d60: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
7d70: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
7d80: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
7d90: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
7da0: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
7db0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
7dc0: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
7dd0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7de0: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
7df0: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
7e00: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
7e10: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
7e20: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
7e30: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
7e40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
7e50: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
7e60: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
7e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
7e80: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
7e90: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
7ea0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7eb0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7ec0: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
7ed0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
7ee0: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
7ef0: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
7f00: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
7f10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7f20: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
7f30: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
7f40: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
7f50: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
7f60: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7f70: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7f80: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
7f90: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
7fa0: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
7fb0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
7fc0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
7fd0: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
7fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
7ff0: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
8000: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8010: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8020: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8050: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8060: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8070: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
80a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
80b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
80c0: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
80d0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
80e0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
80f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8100: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8110: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8120: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8130: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8140: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8150: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8160: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8170: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8180: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
81a0: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
81d0: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
81e0: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8230: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8240: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8260: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8270: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8280: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
8290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
82a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
82b0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
82c0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
82d0: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
82e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
82f0: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
8300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8330: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8340: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
8350: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
8360: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8370: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8380: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
8390: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
83a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
83b0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
83c0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
83d0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
83e0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
83f0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
8400: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
8410: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
8420: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
8430: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
8440: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
8450: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
8460: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
8470: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
8480: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
8490: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
84a0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
84b0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
84c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
84d0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
84e0: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
84f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8500: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
8510: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8520: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
8530: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
8540: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
8550: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
8560: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
8570: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
8580: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
8590: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
85a0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
85b0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
85c0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
85d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
85e0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
85f0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8600: 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , -1); VdbeCover
8610: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
8620: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
8630: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
8640: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
8650: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
8660: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
8670: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
8680: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
8690: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
86a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
86b0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65   N, int X){.  Ke
86c0: 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74  yInfo *p = sqlit
86d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30  e3DbMallocZero(0
86e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
86f0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79        sizeof(Key
8700: 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73  Info) + (N+X)*(s
8710: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
8720: 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  1));.  if( p ){.
8730: 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
8740: 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f  r = (u8*)&p->aCo
8750: 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e  ll[N+X];.    p->
8760: 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b  nField = (u16)N;
8770: 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20  .    p->nXField 
8780: 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d  = (u16)X;.    p-
8790: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
87a0: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
87b0: 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
87c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
87d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
87e0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
87f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
8800: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
8810: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
8820: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
8830: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
8840: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8850: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8860: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8870: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
8880: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
8890: 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20  3DbFree(0, p);. 
88a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
88b0: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
88c0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
88d0: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
88e0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
88f0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
8900: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8910: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
8920: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
8930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8940: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8950: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
8960: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
8970: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
8980: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
8990: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
89a0: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
89b0: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
89c0: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
89d0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
89e0: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
89f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8a00: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
8a10: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8a20: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
8a30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
8a40: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
8a50: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
8a60: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
8a70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
8a80: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
8a90: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
8aa0: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
8ab0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
8ac0: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
8ad0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
8ae0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
8af0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
8b00: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
8b10: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
8b20: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
8b30: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
8b40: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
8b50: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
8b60: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
8b70: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
8b80: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
8b90: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
8ba0: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
8bb0: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
8bc0: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
8bd0: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
8be0: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
8bf0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
8c00: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8c10: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
8c20: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
8c30: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
8c40: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
8c50: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
8c60: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
8c70: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
8c80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8c90: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
8ca0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
8cb0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
8cc0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
8cd0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
8ce0: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
8cf0: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
8d00: 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
8d10: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
8d20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
8d30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8d40: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8d50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
8d60: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
8d70: 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79   /* Form the Key
8d80: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Info object from
8d90: 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a   this ExprList *
8da0: 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20  /.  int iStart, 
8db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
8dc0: 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75  n with this colu
8dd0: 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20  mn of pList */. 
8de0: 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20   int nExtra     
8df0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8e00: 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c  s many extra col
8e10: 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20  umns to the end 
8e20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  */.){.  int nExp
8e30: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
8e40: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
8e50: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8e60: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
8e70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8e80: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
8e90: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
8ea0: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
8eb0: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
8ec0: 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72 61  db, nExpr+nExtra
8ed0: 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 69  -iStart, 1);.  i
8ee0: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
8ef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
8f00: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
8f10: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
8f20: 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49  for(i=iStart, pI
8f30: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74  tem=pList->a+iSt
8f40: 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  art; i<nExpr; i+
8f50: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8f60: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
8f70: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
8f80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
8f90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
8fa0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
8fb0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
8fc0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
8fd0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
8fe0: 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74  ->aColl[i-iStart
8ff0: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
9000: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
9010: 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70  er[i-iStart] = p
9020: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
9030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9040: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69  urn pInfo;.}..#i
9050: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9060: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9070: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
9080: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
9090: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
90a0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
90b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
90c0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
90d0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
90e0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
90f0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9100: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9110: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
9120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9130: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9140: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9150: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9160: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
9170: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9180: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9190: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
91a0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
91b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
91c0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
91d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
91e0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
91f0: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
9200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9210: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
9220: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9230: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9240: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9250: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9260: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9270: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9280: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9290: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
92a0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
92b0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
92c0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
92d0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
92e0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
92f0: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
9300: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
9310: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
9320: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
9330: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
9340: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
9350: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
9360: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
9370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9380: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
9390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
93a0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
93b0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
93c0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
93d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
93e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
93f0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
9400: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
9410: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
9420: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
9430: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
9440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
9450: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
9460: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
9470: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
9480: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
9490: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
94a0: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
94b0: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
94c0: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
94d0: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
94e0: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
94f0: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
9500: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
9510: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
9520: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
9530: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
9540: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
9550: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
9560: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
9570: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
9580: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
9590: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
95a0: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
95b0: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
95c0: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
95d0: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
95e0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
95f0: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
9600: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
9610: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9620: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
9630: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
9640: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
9650: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
9660: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
9670: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9680: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
9690: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
96a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
96b0: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
96c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
96d0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
96e0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
96f0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
9700: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
9710: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
9720: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
9730: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
9740: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
9750: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9760: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
9770: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
9780: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
9790: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
97a0: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
97b0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
97c0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
97d0: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
97e0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
97f0: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9800: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
9810: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
9820: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
9830: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
9840: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
9850: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
9860: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
9870: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
9880: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
9890: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
98a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
98b0: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
98c0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
98d0: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
98e0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
98f0: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9900: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
9910: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
9920: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9930: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
9940: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
9950: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
9960: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
9970: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
9980: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
9990: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
99a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
99c0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
99d0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
9a00: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
9a10: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
9a20: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
9a40: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
9a50: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
9a80: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
9a90: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
9aa0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
9ab0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
9ac0: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
9ad0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
9ae0: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
9af0: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
9b00: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
9b10: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
9b20: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
9b30: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
9b40: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9b50: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
9b60: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9b70: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
9b80: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
9b90: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
9ba0: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
9bb0: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
9bc0: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
9bd0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9be0: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
9bf0: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
9c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9c10: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9c20: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9c30: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9c40: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9c50: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
9c60: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
9c70: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
9c80: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
9c90: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
9ca0: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
9cb0: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
9cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
9cd0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
9ce0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
9cf0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
9d00: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
9d10: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
9d20: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
9d30: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
9d40: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
9d50: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
9d60: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
9d70: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
9d80: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
9d90: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
9da0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
9db0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
9dc0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
9dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9de0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
9df0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
9e00: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
9e10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
9e20: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
9e30: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
9e40: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f  tatement */.  So
9e50: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
9e60: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  /* Information o
9e70: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
9e80: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
9e90: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
9ea0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
9eb0: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
9ec0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
9ed0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
9ee0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
9ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
9f00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9f20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
9f30: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9f40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
9f50: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
9f60: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
9f70: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
9f80: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
9f90: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
9fa0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
9fb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
9fc0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
9fd0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
9fe0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
9ff0: 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
a000: 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72  int iTab;.  Expr
a010: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
a030: 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ;.  int eDest = 
a040: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
a050: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
a060: 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e  t->iSDParm;.  in
a070: 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20  t regRow;.  int 
a080: 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  regRowid;.  int 
a090: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
a0a0: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
a0b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
a0c0: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
a0d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
a0e0: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
a0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a100: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
a110: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
a120: 72 20 2a 2f 0a 20 20 75 38 20 70 35 3b 20 20 20  r */.  u8 p5;   
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 20 20 20 2f 2a 20 70 35 20 70 61 72         /* p5 par
a150: 61 6d 65 74 65 72 20 66 6f 72 20 31 73 74 20 4f  ameter for 1st O
a160: 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  P_Column */.  in
a170: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a1a0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
a1b0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
a1c0: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
a1d0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a1e0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72  N_COMMENTS.  str
a1f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a200: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
a210: 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66  EList->a;.#endif
a220: 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ..  if( pSort->l
a230: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a250: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
a260: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a270: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a280: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
a290: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a2a0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42  P_Goto, 0, addrB
a2b0: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
a2c0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a2d0: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
a2e0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
a2f0: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
a300: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
a310: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a320: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
a330: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72  routine ){.    r
a340: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
a350: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
a360: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
a370: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
a380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a390: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
a3a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a3b0: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
a3c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a3d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a3e0: 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20  nSortData = 1;. 
a3f0: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
a400: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
a410: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
a420: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
a430: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
a440: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
a450: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
a460: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a470: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
a480: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
a490: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
a4a0: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a4b0: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
a4c0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
a4d0: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
a4e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
a4f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a500: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
a510: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
a520: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
a530: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
a540: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
a550: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a560: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
a570: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
a580: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a590: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a5a0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
a5b0: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
a5c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a5d0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a5e0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a5f0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a610: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
a620: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
a630: 4f 75 74 29 3b 0a 20 20 20 20 70 35 20 3d 20 4f  Out);.    p5 = O
a640: 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
a650: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a  ;.    bSeq = 0;.
a660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
a670: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
a680: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a690: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
a6a0: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
a6b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a6c0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a6d0: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a6e0: 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54  nue);.    iSortT
a6f0: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  ab = iTab;.    p
a700: 35 20 3d 20 30 3b 0a 20 20 20 20 62 53 65 71 20  5 = 0;.    bSeq 
a710: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
a720: 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b  =0; i<nSortData;
a730: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a740: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a750: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
a760: 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69  Tab, nKey+bSeq+i
a770: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
a780: 20 69 66 28 20 69 3d 3d 30 20 29 20 73 71 6c 69   if( i==0 ) sqli
a790: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a7a0: 76 2c 20 70 35 29 3b 0a 20 20 20 20 56 64 62 65  v, p5);.    Vdbe
a7b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
a7c0: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
a7d0: 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  e ? aOutEx[i].zN
a7e0: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
a7f0: 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73  zSpan));.  }.  s
a800: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
a810: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
a820: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
a830: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
a840: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a850: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
a860: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a870: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
a880: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
a890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a8a0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
a8b0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
a8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a8d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a8e0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a8f0: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
a900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a910: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
a920: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
a930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a940: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a950: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
a960: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
a970: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a980: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
a990: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a9a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
a9b0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
a9c0: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20   1, regRowid,.  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66        &pDest->af
a9f0: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
aa00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
aa10: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
aa20: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
aa30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
aa40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aa50: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
aa60: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
aa70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa80: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
aa90: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
aaa0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
aab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
aac0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
aad0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
aae0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
aaf0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
ab00: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
ab10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
ab20: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
ab30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ab40: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
ab50: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
ab60: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
ab70: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
ab80: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
ab90: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
aba0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
abb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
abc0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
abd0: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
abe0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ac00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ac10: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
ac20: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
ac30: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
ac40: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
ac50: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
ac60: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
ac70: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
ac80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aca0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
acb0: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
acc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
acd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ace0: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
acf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
ad00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
ad10: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
ad20: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
ad30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ad40: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a   regRowid);.  }.
ad50: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
ad60: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
ad70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
ad80: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
ad90: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69  drContinue);.  i
ada0: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
adb0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
adc0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
add0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ade0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
adf0: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
ae00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ae10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ae20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ae30: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
ae40: 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  b, addr); VdbeCo
ae50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
ae60: 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52   if( pSort->regR
ae70: 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56  eturn ) sqlite3V
ae80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ae90: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72  Return, pSort->r
aea0: 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c  egReturn);.  sql
aeb0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
aec0: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
aed0: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  k);.}../*.** Ret
aee0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
aef0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
af00: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
af10: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
af20: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
af30: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
af40: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
af50: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
af60: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
af70: 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74   Also try to est
af80: 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f  imate the size o
af90: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
afa0: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
afb0: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
afc0: 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a  n *pEstWidth..**
afd0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
afe0: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
aff0: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
b000: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
b010: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
b020: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
b030: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
b040: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b050: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
b060: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
b070: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
b080: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
b090: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
b0a0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
b0b0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b0c0: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
b0d0: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
b0e0: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
b0f0: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
b100: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
b110: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
b120: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
b130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
b140: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
b150: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
b160: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
b170: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
b180: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b190: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b1a0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b1b0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b1c0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
b1d0: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
b1e0: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
b1f0: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
b200: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
b210: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
b220: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
b230: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
b240: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  umn is NULL..**.
b250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b260: 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20  has either 3 or 
b270: 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70  6 parameters dep
b280: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
b290: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
b2a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
b2b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f  LUMN_METADATA co
b2c0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
b2d0: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  n is used..*/.#i
b2e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b2f0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b300: 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  TA.# define colu
b310: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b320: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b330: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a  pl(A,B,C,D,E,F).
b340: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b350: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
b360: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
b370: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
b380: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
b390: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
b3a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
b3b0: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
b3c0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
b3d0: 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  ol,.  u8 *pEstWi
b3e0: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
b3f0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
b400: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
b410: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
b420: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b430: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20  gCol = 0;.#else 
b440: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
b450: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b460: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
b470: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b480: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b490: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b4a0: 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63  (A,B,F).static c
b4b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b4c0: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b4d0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b4e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
b4f0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
b500: 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  {.#endif /* !def
b510: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
b520: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b530: 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  TA) */.  char co
b540: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
b550: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
b560: 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69  tWidth = 1;..  i
b570: 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
b580: 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  0) || pNC->pSrcL
b590: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
b5a0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
b5b0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
b5c0: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
b5d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
b5e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
b5f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b600: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
b610: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
b620: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
b630: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
b640: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
b650: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
b660: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
b670: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
b680: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
b690: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
b6a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b6b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b6d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
b6e0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
b6f0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
b700: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b720: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
b730: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
b740: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
b750: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
b760: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
b770: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
b780: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
b790: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b7a0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
b7b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b7c0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
b7d0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b7e0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
b7f0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
b800: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
b810: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
b820: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
b830: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
b840: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
b850: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
b860: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
b870: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
b880: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
b8a0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
b8b0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
b8c0: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
b8d0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
b8e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b8f0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
b900: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
b910: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
b920: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
b930: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
b940: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
b950: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
b960: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
b970: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
b980: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
b990: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
b9a0: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
b9b0: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
b9c0: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
b9d0: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
b9e0: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
b9f0: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
ba00: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
ba10: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
ba20: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
ba30: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
ba40: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
ba50: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
ba60: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
ba70: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
ba80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
ba90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
baa0: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
bab0: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
bac0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
bad0: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
bae0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
baf0: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
bb00: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bb10: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
bb20: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
bb30: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
bb40: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
bb50: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
bb60: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
bb70: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
bb80: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
bb90: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
bba0: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
bbb0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bbc0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
bbd0: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
bbe0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
bbf0: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
bc00: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
bc10: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
bc20: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
bc30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
bc40: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
bc50: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
bc60: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
bc70: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
bc80: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
bc90: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
bca0: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
bcb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bcc0: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
bcd0: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
bce0: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
bcf0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
bd00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
bd10: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
bd20: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
bd30: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
bd40: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
bd50: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
bd60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
bd70: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
bd80: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
bd90: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
bda0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
bdb0: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
bdc0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
bdd0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
bde0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
bdf0: 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
be00: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
be10: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
be20: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
be30: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
be40: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
be50: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
be60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
be70: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
be80: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
be90: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
bea0: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
beb0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
bec0: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
bed0: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
bee0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
bef0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bf00: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
bf10: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
bf20: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
bf30: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
bf40: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
bf50: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
bf60: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
bf70: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
bf80: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
bf90: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
bfa0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
bfb0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
bfc0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
bfd0: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
bfe0: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
bff0: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  dth); .        }
c000: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c010: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
c020: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
c030: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
c040: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
c050: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c060: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
c070: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
c080: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
c090: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
c0a0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
c0b0: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
c0c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c0d0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c0e0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
c100: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
c110: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c120: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
c130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c140: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c150: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c160: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
c170: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
c180: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
c190: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
c1a0: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c1b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c1c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c1d0: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
c1e0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
c1f0: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
c200: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
c210: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c220: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c230: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
c240: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c250: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c260: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
c270: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
c280: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
c290: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
c2a0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c2b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
c2c0: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
c2d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c2e0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c2f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c300: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c310: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c320: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c330: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
c340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c350: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
c360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c370: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
c380: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
c390: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
c3a0: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
c3b0: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
c3c0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c3d0: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
c3e0: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
c3f0: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
c400: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
c410: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
c420: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
c430: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
c440: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c450: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
c460: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
c470: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
c480: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c490: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c4a0: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
c4b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
c4c0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
c4d0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
c4e0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c4f0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
c500: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c510: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
c520: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
c530: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
c540: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c550: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c560: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c570: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c590: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
c5a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c5b0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c5c0: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
c5d0: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
c5e0: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
c5f0: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
c600: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
c610: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
c620: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
c630: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
c640: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
c650: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
c660: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
c670: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
c680: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
c690: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c6a0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c6b0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
c6c0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c6d0: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
c6e0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
c6f0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
c700: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
c710: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
c720: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
c730: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
c740: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
c750: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
c760: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
c770: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c780: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
c790: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
c7a0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
c7b0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
c7c0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
c7d0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c7e0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
c7f0: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
c800: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
c810: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
c820: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
c830: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
c840: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
c850: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
c860: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
c870: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
c880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
c890: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
c8a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c8b0: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
c8c0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
c8d0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
c8e0: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
c8f0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
c900: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
c910: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
c920: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c930: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c940: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c950: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
c960: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
c970: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
c980: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
c990: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
c9a0: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
c9b0: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
c9c0: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
c9d0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
c9e0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
c9f0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
ca00: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
ca10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ca20: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ca30: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
ca40: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
ca50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
ca60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ca70: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ca80: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
ca90: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
caa0: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
cab0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cac0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
cad0: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
cae0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
caf0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
cb00: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
cb10: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
cb20: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
cb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cb40: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cb50: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
cb60: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
cb70: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
cb80: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
cb90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
cba0: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
cbb0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cbc0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cbd0: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
cbe0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
cbf0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
cc00: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
cc10: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
cc20: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
cc30: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
cc40: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
cc50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
cc60: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
cc70: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
cc80: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
cc90: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
cca0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
ccb0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ccc0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ccd0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
cce0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
ccf0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cd00: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
cd10: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cd20: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
cd30: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
cd40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cd50: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
cd60: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
cd70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd80: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
cd90: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
cda0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
cdb0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
cdc0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
cdd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cde0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
cdf0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
ce00: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
ce10: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
ce20: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
ce30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
ce40: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
ce50: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
ce60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
ce70: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
ce80: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
ce90: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
cea0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
ceb0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
cec0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
ced0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
cee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
cef0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
cf00: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
cf10: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
cf20: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
cf30: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
cf40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
cf50: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
cf60: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
cf70: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
cf80: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
cf90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cfa0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
cfb0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
cfc0: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
cfd0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
cfe0: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
cff0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
d000: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
d010: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
d020: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
d030: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
d040: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
d050: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
d060: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
d070: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
d080: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
d090: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d0a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
d0b0: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
d0c0: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
d0d0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
d0e0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
d0f0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
d100: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
d110: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
d120: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
d130: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
d140: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
d150: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
d160: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
d170: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
d180: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d190: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
d1a0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
d1b0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d1c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
d1d0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
d1e0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
d1f0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
d200: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
d210: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d220: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d230: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
d240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
d250: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
d260: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
d270: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d280: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d290: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
d2a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d2b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
d2c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
d2d0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
d2e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
d2f0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
d300: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d310: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d320: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d330: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d340: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d360: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d370: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d380: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d390: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
d3a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
d3c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d3d0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
d3e0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
d3f0: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
d400: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
d410: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
d420: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
d430: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d440: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d450: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
d460: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
d470: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
d480: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
d490: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
d4a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
d4b0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
d4c0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d4d0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d4e0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d4f0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d500: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d510: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d520: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d530: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d540: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d550: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d560: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d570: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d580: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d590: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d5a0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d5b0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d5c0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d5d0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d5e0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d5f0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d600: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d610: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d620: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d630: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d640: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d650: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d660: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d670: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d680: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d690: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d6a0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d6b0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d6c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d6d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d6e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d6f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d700: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d710: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d720: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d730: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d740: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d750: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d760: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d770: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d780: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d790: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d7a0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d7b0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d7c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d7d0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d7e0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d7f0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d800: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d810: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d820: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d830: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d840: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d850: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
d860: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
d870: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
d880: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
d890: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
d8a0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
d8b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
d8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d8d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d8e0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d8f0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d900: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
d910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d920: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
d930: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
d940: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
d950: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
d960: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
d970: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
d980: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
d990: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d9a0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
d9b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
d9c0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
d9d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
d9e0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
d9f0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
da00: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
da10: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
da20: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
da30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
da40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
da50: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
da60: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
da70: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
da80: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
da90: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
daa0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
dab0: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
dac0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
dad0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
dae0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
daf0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
db00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
db10: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
db20: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
db30: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
db40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
db50: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
db60: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
db70: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
db80: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
db90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dba0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dbb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
dbc0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
dbd0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
dbe0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
dbf0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
dc00: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
dc10: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
dc20: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
dc30: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
dc40: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
dc50: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
dc60: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
dc70: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
dc80: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
dc90: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
dca0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
dcb0: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
dcc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dcd0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
dce0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
dcf0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
dd00: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
dd10: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
dd20: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
dd30: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
dd40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
dd50: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
dd60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
dd70: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
dd80: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
dd90: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
dda0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ddb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
ddc0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ddd0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
dde0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
ddf0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
de00: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
de10: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
de20: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
de30: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
de40: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
de50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
de60: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
de70: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
de80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
de90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
dea0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
deb0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
dec0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
ded0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
dee0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
def0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
df00: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
df10: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
df20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
df30: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
df40: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
df50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
df60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
df70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
df80: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
df90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dfa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
dfb0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
dfc0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
dfd0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
dfe0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
dff0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
e000: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e010: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e020: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e030: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
e040: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e050: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
e060: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
e070: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
e080: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
e090: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
e0a0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
e0b0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
e0c0: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
e0d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
e0e0: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
e0f0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
e100: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
e110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d  .        if( k>=
e120: 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27  0 && zName[k]=='
e130: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
e140: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
e150: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
e160: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
e170: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e180: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
e190: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
e1a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e1b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e1c0: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
e1d0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
e1e0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
e1f0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
e200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e210: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
e220: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
e230: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e240: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
e250: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e270: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
e280: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
e290: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e2a0: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
e2b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
e2c0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
e2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e2e0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
e2f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e300: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
e310: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
e320: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
e330: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
e340: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
e350: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
e360: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
e370: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
e380: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
e390: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
e3a0: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
e3b0: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
e3c0: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
e3d0: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
e3e0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
e3f0: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
e400: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
e410: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e430: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
e440: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
e450: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
e460: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
e470: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
e480: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
e490: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
e4a0: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
e4b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e4c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e4d0: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
e4e0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e4f0: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
e500: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
e510: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
e520: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e530: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
e540: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
e550: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
e560: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
e570: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e580: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
e590: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e5a0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
e5b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
e5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
e5d0: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
e5e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
e5f0: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
e600: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
e610: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
e620: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
e630: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
e640: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
e650: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e660: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
e670: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
e680: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e690: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e6a0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
e6b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
e6c0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
e6d0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
e6e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e6f0: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
e700: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
e710: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
e720: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
e730: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e740: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
e750: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
e760: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
e770: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
e780: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
e790: 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73  ,0,0,0, &pCol->s
e7a0: 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c  zEst));.    szAl
e7b0: 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  l += pCol->szEst
e7c0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
e7d0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
e7e0: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
e7f0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
e800: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
e810: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
e820: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
e830: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
e840: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e850: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
e860: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
e870: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
e880: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e890: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
e8a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
e8b0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
e8c0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
e8d0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
e8e0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
e8f0: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
e900: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
e910: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
e920: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
e930: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
e940: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
e950: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
e960: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
e970: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
e980: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
e990: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
e9a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e9b0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
e9c0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
e9d0: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
e9e0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
e9f0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
ea00: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
ea10: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
ea20: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
ea30: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
ea40: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
ea50: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ea60: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
ea70: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
ea80: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
ea90: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
eaa0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
eab0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
eac0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
ead0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
eae0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
eaf0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
eb00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
eb10: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
eb20: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
eb30: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
eb40: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
eb50: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
eb60: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
eb70: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
eb80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
eb90: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
eba0: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
ebb0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
ebc0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
ebd0: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
ebe0: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
ebf0: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
ec00: 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75   );.  selectColu
ec10: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
ec20: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
ec30: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
ec40: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
ec50: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
ec60: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
ec70: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
ec80: 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab, pSelect);.  
ec90: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
eca0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
ecb0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ecc0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
ecd0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
ece0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ecf0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
ed00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ed10: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
ed20: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
ed30: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
ed40: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
ed50: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ed60: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
ed70: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
ed80: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
ed90: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
eda0: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
edb0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
edc0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
edd0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
ede0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
edf0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
ee00: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
ee10: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
ee20: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
ee30: 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29  dOp0(v, OP_Init)
ee40: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
ee50: 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20  ->pToplevel==0. 
ee60: 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
ee70: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
ee80: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
ee90: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20  torOutConst).   
eea0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
eeb0: 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
eec0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  = 1;.    }..  }.
eed0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
eee0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
eef0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ef00: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ef10: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ef20: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ef30: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ef40: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ef50: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ef60: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
ef70: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
ef80: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
ef90: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
efa0: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
efb0: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
efc0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
efd0: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
efe0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
eff0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f000: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
f010: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
f020: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
f030: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
f040: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
f050: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
f060: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
f070: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
f080: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
f090: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
f0a0: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
f0b0: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
f0c0: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
f0d0: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
f0e0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f0f0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
f100: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
f110: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
f120: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
f130: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
f140: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
f150: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
f160: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
f170: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
f180: 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
f190: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
f1a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
f1b0: 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
f1c0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
f1d0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f1e0: 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
f1f0: 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
f200: 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
f210: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
f220: 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
f230: 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
f240: 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
f250: 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
f260: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
f270: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
f280: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
f290: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
f2a0: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
f2b0: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
f2c0: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
f2d0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
f2e0: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
f2f0: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
f300: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
f310: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
f320: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
f330: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
f340: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f350: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
f360: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
f370: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
f380: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
f390: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
f3a0: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
f3b0: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
f3c0: 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66  t addr1, n;.  if
f3d0: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
f3e0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
f3f0: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
f400: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
f410: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
f420: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
f430: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
f440: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
f450: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
f460: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
f470: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
f480: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
f490: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
f4a0: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
f4b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f4c0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
f4d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
f4e0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c  fset==0 || p->pL
f4f0: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  imit!=0 );.  if(
f500: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
f510: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
f520: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
f530: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
f540: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f550: 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72  arse);.    asser
f560: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( v!=0 );.    i
f570: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
f580: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
f590: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
f5a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f5b0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f5c0: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
f5d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f5e0: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f5f0: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
f600: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
f610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f620: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
f630: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f640: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
f650: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
f660: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
f670: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
f680: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
f690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f6a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f6b0: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
f6c0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6e0: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
f6f0: 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
f700: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f710: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f720: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f730: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
f740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f750: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
f760: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
f770: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f780: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
f790: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
f7a0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
f7b0: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
f7c0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
f7d0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
f7e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
f7f0: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
f800: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
f810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f820: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f830: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
f840: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
f850: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f860: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
f870: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
f880: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f890: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f8a0: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
f8b0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
f8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8d0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
f8e0: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
f8f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f910: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f920: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
f930: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f940: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f950: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f960: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f970: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
f980: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
f990: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
f9a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f9b0: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
f9c0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f9d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f9e0: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
f9f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
fa00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa20: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
fa30: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
fa40: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fa50: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
fa60: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
fa70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fa80: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
fa90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
faa0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
fab0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
fac0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
fad0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
fae0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
faf0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
fb00: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
fb10: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
fb20: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
fb30: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
fb40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fb50: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
fb60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fb70: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
fb80: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
fb90: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
fba0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
fbb0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
fbc0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
fbd0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
fbe0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
fbf0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fc00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fc10: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
fc20: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
fc30: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
fc40: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
fc50: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
fc60: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fc70: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
fc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
fc90: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
fca0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
fcb0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
fcc0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
fcd0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
fce0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
fcf0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
fd00: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
fd10: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
fd20: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fd30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
fd40: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
fd50: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
fd60: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
fd70: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
fd80: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
fd90: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
fda0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
fdb0: 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
fdc0: 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
fdd0: 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
fde0: 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
fdf0: 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
fe00: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
fe10: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
fe20: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
fe30: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
fe40: 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
fe50: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
fe60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
fe70: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
fe80: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
fe90: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
fea0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
feb0: 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
fec0: 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
fed0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fee0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
fef0: 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
ff00: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
ff10: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ff20: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
ff30: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
ff40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ff50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
ff60: 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
ff70: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
ff80: 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
ff90: 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
ffa0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
ffb0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ffc0: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
ffd0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
ffe0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
fff0: 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
10000 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
10010 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
10020 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
10030 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
10040 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
10050 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
10060 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
10070 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10080 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10090 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
100a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
100b0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
100c0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
100d0 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
100e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
100f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
10100 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
10110 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
10120 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
10130 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
10140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10150 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
10160 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
10170 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
10180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10190 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
101a0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
101b0 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
101c0 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
101d0 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
101e0 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
101f0 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
10200 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
10210 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
10220 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
10230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10240 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
10250 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
10260 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
10270 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
10280 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
10290 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
102a0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
102b0 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
102c0 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
102d0 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
102e0 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
102f0 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
10320 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
10330 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
10360 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
10370 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
10380 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
10390 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
103a0 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
103b0 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
103c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
103d0 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
103e0 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
103f0 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
10400 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  ].isRecursive fl
10410 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
10420 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
10430 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
10440 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
10450 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
10460 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
10470 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
10480 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
10490 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
104a0 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
104b0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
104c0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
104d0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
104e0 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
104f0 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
10500 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
10510 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
10520 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
10530 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
10540 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
10550 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
10560 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
10570 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
10580 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
10590 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
105a0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
105b0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
105c0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
105d0 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
105e0 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
105f0 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
10600 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10610 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
10620 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
10630 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
10640 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
10650 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
10660 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
10670 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
10680 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
10690 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
106a0 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
106b0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
106c0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
106d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
106e0 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
106f0 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
10700 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
10710 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
10720 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
10730 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
10740 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
10750 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
10760 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
10770 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
10780 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
10790 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
107a0 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
107b0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
107c0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
107d0 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
107e0 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
107f0 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
10800 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
10810 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
10820 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
10830 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
10840 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
10850 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
10860 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
10870 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
10880 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
10890 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
108a0 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
108b0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
108c0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
108d0 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
108e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
108f0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
10900 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
10910 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
10920 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
10930 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
10940 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
10950 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
10960 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
10970 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
10980 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
10990 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
109a0 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
109b0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
109c0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
109d0 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
109e0 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
109f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10a00 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10a10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10a30 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
10a40 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
10a50 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
10a60 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
10a70 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
10a80 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10a90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10aa0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
10ab0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
10ac0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
10ad0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10ae0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
10af0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
10b00 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10b10 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
10b20 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
10b30 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10b40 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
10b50 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
10b60 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
10b70 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
10b80 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
10b90 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
10ba0 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
10bb0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
10bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10bd0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
10be0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
10bf0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
10c00 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
10c10 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
10c20 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
10c30 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
10c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10c50 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
10c60 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
10c70 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
10c80 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10c90 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
10ca0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10cb0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
10cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10cd0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10ce0 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
10cf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
10d00 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
10d10 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
10d20 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
10d30 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
10d40 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
10d50 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
10d60 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
10d70 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
10d80 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
10d90 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
10da0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10db0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10dd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10de0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
10e10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10e20 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
10e30 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
10e40 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10e50 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
10e60 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
10e70 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
10e80 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
10e90 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
10ea0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
10eb0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
10ec0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10ed0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
10ee0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
10ef0 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
10f00 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
10f10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
10f20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
10f30 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
10f40 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
10f50 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
10f60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10f70 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
10f80 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
10f90 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
10fa0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10fb0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
10fc0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10fd0 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
10fe0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
10ff0 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
11000 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
11010 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
11020 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
11030 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
11040 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
11050 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
11060 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
11070 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
11080 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11090 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
110a0 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
110b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
110c0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
110d0 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
110e0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
110f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
11100 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73  c->a[i].isRecurs
11110 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
11120 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
11130 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
11140 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11150 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
11160 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
11170 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
11180 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
11190 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
111a0 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
111b0 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
111c0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
111d0 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
111e0 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
111f0 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
11200 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
11210 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
11220 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
11230 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
11240 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
11250 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
11260 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
11270 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
11280 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
11290 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
112a0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
112b0 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
112c0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
112d0 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
112e0 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
112f0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11300 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
11310 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
11320 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
11330 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
11340 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
11350 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
11360 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
11370 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11390 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
113a0 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
113b0 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
113c0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
113d0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
113e0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
113f0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
11400 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
11410 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
11420 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11430 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11440 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
11450 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
11480 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11490 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
114a0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
114b0 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
114c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
114e0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
114f0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
11500 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11510 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
11520 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
11530 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
11540 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
11550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11560 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11570 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
11580 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
11590 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
115a0 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
115b0 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
115c0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
115d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
115e0 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
115f0 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11600 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11610 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
11620 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
11630 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
11640 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
11650 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11660 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
11670 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
11680 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
11690 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
116a0 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
116b0 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
116c0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
116d0 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
116e0 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
116f0 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
11700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11710 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
11720 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
11730 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11740 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
11750 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
11760 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
11770 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
11780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11790 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
117a0 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
117b0 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
117c0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
117d0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
117e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
117f0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
11800 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11810 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
11820 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
11830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11840 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
11850 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
11860 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
11870 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11880 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
11890 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
118a0 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
118b0 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
118c0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
118d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
118e0 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
118f0 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
11900 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
11910 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
11920 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
11930 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
11940 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
11950 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
11960 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
11970 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
11980 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11990 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67  , OP_IfZero, reg
119a0 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
119b0 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  , -1);.    VdbeC
119c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
119d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
119e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
119f0 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
11a00 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
11a10 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
11a20 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
11a30 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
11a40 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
11a50 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
11a60 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
11a70 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
11a80 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d  Queue..  */.  p-
11a90 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
11aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11ab0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
11ac0 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ue);.  assert( p
11ad0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
11ae0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11af0 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  tup;..  /* Keep 
11b00 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
11b10 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11b20 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
11b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11b50 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
11b60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11b70 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
11b80 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
11b90 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
11ba0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11bb0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11bc0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
11bd0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
11be0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
11bf0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11c00 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
11c10 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
11c20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11c30 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
11c40 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
11c50 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
11c60 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
11c70 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
11c80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11c90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11ca0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11cb0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11cc0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
11cd0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
11ce0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11cf0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11d00 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11d10 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11d20 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.);.../*.**
11d30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11d40 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
11d50 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
11d60 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
11d70 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
11d80 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
11d90 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
11da0 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
11db0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
11dc0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
11dd0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
11de0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
11df0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
11e00 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
11e10 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
11e20 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
11e30 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
11e40 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
11e50 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
11e60 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
11e70 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
11e80 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
11e90 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
11ea0 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
11eb0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
11ec0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
11ed0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
11ee0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
11ef0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
11f00 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
11f10 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
11f20 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
11f30 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
11f40 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
11f50 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
11f60 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
11f70 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
11f80 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
11f90 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
11fa0 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
11fb0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
11fc0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
11fd0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
11fe0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
11ff0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
12000 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
12010 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
12020 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
12030 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
12040 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
12050 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
12060 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
12070 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
12080 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
12090 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
120a0 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
120b0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
120c0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
120d0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
120e0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
120f0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
12100 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12110 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
12120 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
12130 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
12140 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
12150 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
12160 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
12170 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
12180 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
12190 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
121a0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
121b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
121c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
121d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
121e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
121f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12200 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12210 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12220 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12230 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12240 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12250 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
12260 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
12270 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
12280 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
12290 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
122a0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
122b0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
122c0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
122d0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
122e0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
122f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12300 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
12310 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
12320 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
12330 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
12340 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
12350 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
12360 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
12370 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
12380 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
12390 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
123a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
123b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
123c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
123d0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
123e0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
123f0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12400 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12410 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
12420 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12430 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12440 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12450 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
12460 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
12470 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
12480 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12490 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
124a0 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
124b0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
124c0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
124d0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
124e0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
124f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
12500 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12510 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
12520 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
12530 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
12540 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
12550 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
12560 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
12570 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
12580 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
12590 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
125a0 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
125b0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
125c0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
125d0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
125e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
125f0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
12600 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
12610 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12620 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12630 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
12640 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
12650 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
12660 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
12680 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
12690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
126a0 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
126b0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
126c0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
126d0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
126e0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
126f0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12700 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12710 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12720 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
12730 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12740 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12750 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
12760 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
12770 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
12780 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
12790 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
127a0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
127b0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
127c0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
127d0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
127e0 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
127f0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12810 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12820 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
12830 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
12840 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
12850 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12860 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
12870 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
12880 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
12890 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
128a0 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
128b0 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
128c0 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
128d0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
128e0 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
128f0 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
12900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12910 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
12920 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
12930 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
12940 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
12950 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
12960 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
12970 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
12980 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
129a0 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
129b0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
129c0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
129d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
129e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
129f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
12a00 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
12a10 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
12a20 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e  ".        " do n
12a30 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12a40 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
12a50 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
12a60 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
12a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12a80 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
12a90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12aa0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12ab0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
12ac0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12ad0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
12ae0 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
12af0 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
12b00 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
12b10 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
12b20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
12b30 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
12b40 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
12b50 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
12b60 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
12b70 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
12b80 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
12b90 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
12ba0 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
12bb0 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
12bc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12bd0 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
12be0 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
12bf0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
12c00 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
12c10 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12c20 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
12c30 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
12c40 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
12c50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
12c60 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
12c70 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
12c80 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12c90 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12ca0 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
12cb0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
12cc0 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
12cd0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
12ce0 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
12cf0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
12d00 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
12d10 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
12d20 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
12d30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12d40 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12d50 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
12d60 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
12d70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
12d80 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12d90 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
12da0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
12db0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12dd0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
12de0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
12df0 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
12e00 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
12e10 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
12e20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
12e30 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
12e40 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12e50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
12e60 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
12e70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12e80 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
12e90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
12ea0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
12eb0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
12ec0 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
12ed0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
12ee0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
12ef0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
12f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12f10 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12f20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
12f30 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
12f50 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
12f60 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
12f70 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
12f80 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
12f90 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
12fa0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
12fb0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
12fc0 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
12fd0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
12fe0 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
12ff0 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
13000 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
13010 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
13020 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
13030 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
13040 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
13050 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
13060 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
13070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13090 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
130a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
130b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
130c0 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
130d0 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
130e0 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
130f0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
13100 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
13110 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
13120 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
13130 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
13140 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
13150 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
13160 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
13170 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
13180 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
13190 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
131a0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
131b0 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
131c0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
131d0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
131e0 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
131f0 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
13200 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
13210 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13220 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
13230 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
13240 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13250 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
13260 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
13270 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13280 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
13290 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
132a0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
132b0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
132c0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
132d0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
132e0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
132f0 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
13300 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
13310 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
13320 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13330 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
13340 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
13350 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
13360 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
13370 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13380 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
13390 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
133a0 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
133b0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
133c0 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
133d0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
133e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
133f0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
13400 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
13410 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
13420 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
13430 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
13440 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
13450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
13460 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
13470 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
13480 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13490 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
134a0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
134b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
134c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
134d0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
134e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
134f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13500 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
13510 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13520 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
13530 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
13540 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
13550 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
13560 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
13570 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13580 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13590 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
135a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
135b0 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
135c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
135d0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
135e0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
135f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13600 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
13610 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
13620 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
13630 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13640 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
13650 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13670 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
13680 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
13690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
136a0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
136b0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
136c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
136d0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
136e0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
136f0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
13700 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13710 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
13720 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
13730 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
13740 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13750 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
13760 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
13770 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
13780 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
13790 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
137a0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
137b0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
137c0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
137d0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
137e0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
137f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
13800 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
13810 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
13820 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13830 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
13840 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13860 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13870 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
13880 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
138a0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
138b0 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
138c0 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
138d0 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
138e0 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
138f0 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
13900 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
13910 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
13920 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
13930 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
13940 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13950 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
13960 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13970 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13980 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13990 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
139a0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
139b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
139c0 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
139d0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
139e0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
139f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13a00 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13a10 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
13a20 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
13a30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
13a40 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
13a50 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
13a60 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
13a70 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
13a80 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
13a90 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
13aa0 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
13ab0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
13ac0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
13ad0 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
13ae0 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
13af0 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
13b00 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
13b10 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
13b20 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
13b30 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
13b40 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
13b50 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13b60 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13b70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13b80 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13b90 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
13ba0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
13bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
13bc0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
13bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
13be0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
13bf0 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
13c00 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
13c10 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
13c20 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
13c30 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
13c40 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
13c50 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
13c60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13c70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13c80 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
13c90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13ca0 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
13cb0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13cc0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
13cd0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
13ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13cf0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
13d00 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
13d10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13d20 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
13d30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13d40 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13d50 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
13d60 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
13d70 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
13d80 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13da0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13db0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13dd0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
13de0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
13df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13e00 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
13e10 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
13e20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13e40 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13e50 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
13e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
13e80 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
13e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13ea0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13eb0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
13ec0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
13ed0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
13ee0 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
13ef0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13f00 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13f10 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
13f20 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
13f30 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
13f40 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13f50 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
13f60 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
13f70 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
13f80 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
13f90 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
13fa0 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
13fb0 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
13fc0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
13fd0 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
13fe0 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
13ff0 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
14000 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
14010 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
14020 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14030 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
14040 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
14050 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
14060 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
14070 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
14080 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
14090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
140a0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
140b0 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
140c0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
140d0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
140e0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
140f0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14100 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14110 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
14120 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
14130 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
14140 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
14150 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
14160 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
14170 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
14180 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
14190 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
141a0 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
141b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
141c0 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
141d0 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
141e0 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
141f0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14200 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
14210 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14220 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14230 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14240 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
14250 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
14260 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14270 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14280 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
14290 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
142a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
142b0 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
142c0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
142d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
142e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
142f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14300 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
14310 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
14320 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14330 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
14340 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14350 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
14360 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14370 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14380 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14390 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
143a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
143b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
143c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
143d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
143e0 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
143f0 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
14400 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14410 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14420 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14430 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14440 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14450 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
14460 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
14470 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14480 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14490 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
144a0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
144b0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
144c0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
144d0 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
144e0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
144f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
14500 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14510 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14520 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
14530 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
14540 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
14550 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14560 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
14570 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
14580 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
14590 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
145a0 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
145b0 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
145c0 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
145d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
145e0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
145f0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14600 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14610 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
14620 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
14630 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
14640 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
14650 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
14660 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
14670 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
14680 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
14690 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
146a0 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
146b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
146c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
146d0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
146e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
146f0 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
14700 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14710 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
14720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14730 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14740 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
14750 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
14760 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
14770 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14780 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14790 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
147a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
147b0 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
147c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
147d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
147e0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
147f0 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
14800 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
14810 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
14820 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14830 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14840 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
14850 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
14860 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
14870 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
14880 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14890 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
148a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
148b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
148c0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
148d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
148f0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
14900 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14920 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14930 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
14940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14950 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
14960 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
14970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14980 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14990 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
149a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
149b0 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
149c0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
149d0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
149e0 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
149f0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
14a00 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14a10 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
14a20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
14a30 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
14a40 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
14a50 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
14a60 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
14a70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
14a80 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
14a90 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
14aa0 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
14ab0 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
14ac0 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14ad0 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
14ae0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
14af0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
14b00 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
14b10 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
14b20 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
14b30 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
14b40 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
14b50 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
14b60 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
14b70 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
14b80 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
14b90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14ba0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
14bb0 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
14bc0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14bf0 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
14c00 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
14c10 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14c20 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
14c30 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
14c40 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
14c50 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
14c60 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
14c70 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
14c80 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
14c90 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
14ca0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
14cb0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
14cc0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
14cd0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
14ce0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
14d10 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
14d20 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
14d30 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
14d40 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
14d50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
14d60 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
14d70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
14d80 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
14d90 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
14da0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
14db0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14dc0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14dd0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
14de0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
14df0 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
14e00 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
14e10 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
14e20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
14e30 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
14e40 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
14e50 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
14e60 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
14e70 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
14e80 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
14e90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
14ea0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
14eb0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
14ec0 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
14ed0 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
14ee0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
14ef0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
14f00 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
14f10 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
14f20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
14f30 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
14f40 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
14f50 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
14f60 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
14f70 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
14f80 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
14f90 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
14fa0 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
14fb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14fc0 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
14fd0 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
14fe0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15000 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15010 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
15020 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
15030 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15040 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
15050 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
15060 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
15090 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
150a0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
150b0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
150c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
150d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
150e0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
150f0 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
15100 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
15110 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
15120 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
15130 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
15140 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15150 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
15160 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15170 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15180 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
15190 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
151a0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
151b0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
151c0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
151d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
151e0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
151f0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
15200 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
15210 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
15220 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
15230 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
15240 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
15250 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
15260 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
15270 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
15280 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
15290 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
152a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
152b0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
152c0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
152d0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
152e0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
152f0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
15300 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15310 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
15320 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
15330 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
15340 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
15350 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
15360 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
15370 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
15380 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15390 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
153a0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
153b0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
153c0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
153d0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
153e0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
153f0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
15400 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
15410 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
15420 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
15430 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
15440 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
15450 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
15460 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
15470 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
15480 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
15490 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
154a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154c0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
154d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
154e0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
154f0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
15500 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
15510 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15520 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
15530 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
15540 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
15550 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
15560 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
15570 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
15580 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
15590 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
155a0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
155b0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
155c0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
155d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
155e0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
155f0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
15600 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
15610 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
15620 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
15630 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
15640 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
15650 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
15660 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
15670 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
15680 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
15690 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
156a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
156b0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
156c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
156d0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
156e0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
156f0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
15700 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
15710 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
15720 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
15730 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
15740 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
15750 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
15760 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
15770 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15780 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15790 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
157a0 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
157b0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
157c0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
157f0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
15800 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
15810 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
15820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15830 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
15840 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
15850 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
15860 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
15870 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15880 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
15890 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
158a0 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
158b0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
158c0 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
158d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
158e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
158f0 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
15900 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
15910 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15920 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
15930 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
15940 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
15950 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
15960 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
15970 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
15980 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
15990 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
159a0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
159b0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
159c0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
159d0 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
159e0 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
159f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15a00 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
15a10 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
15a20 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
15a30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15a40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15a50 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
15a60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15a70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
15a80 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
15a90 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
15aa0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15ab0 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
15ac0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
15ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ae0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
15af0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
15b00 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
15b10 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
15b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b30 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
15b40 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
15b50 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
15b60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15b70 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
15b80 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
15b90 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15ba0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
15bb0 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
15bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15bd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15be0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
15bf0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15c00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15c10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15c20 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
15c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15c40 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
15c50 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
15c60 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
15c70 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
15c80 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
15c90 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
15ca0 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
15cb0 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
15cc0 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
15cd0 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
15ce0 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
15cf0 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
15d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15d10 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
15d20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
15d30 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
15d40 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  st==1 );.      p
15d50 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
15d60 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
15d70 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
15d80 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
15d90 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
15da0 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
15db0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15dc0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15de0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
15df0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
15e00 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
15e10 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
15e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15e30 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
15e40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
15e50 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
15e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
15e80 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
15e90 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
15ea0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15eb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15ec0 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
15ed0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
15ee0 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
15ef0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
15f00 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
15f10 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
15f20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
15f30 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
15f40 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
15f50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
15f60 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
15f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f80 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15f90 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44  r, 1, pDest->iSD
15fa0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
15fb0 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
15fc0 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
15fd0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
15fe0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
15ff0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
16000 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
16010 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
16020 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16030 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
16040 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
16050 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
16060 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16070 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
16080 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
16090 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
160a0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
160b0 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
160c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
160d0 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
160e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
160f0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
16100 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16110 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
16120 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
16130 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
16140 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
16150 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
16160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16170 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
16180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16190 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
161a0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
161b0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
161c0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
161d0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
161e0 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
161f0 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
16200 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
16210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16220 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
16230 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
16240 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
16250 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
16260 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
16270 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
16280 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
16290 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
162a0 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
162b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
162c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
162d0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
162e0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
162f0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53  iSdst, pDest->nS
16300 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
16310 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16320 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
16330 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
16340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16350 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
16360 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
16370 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
16380 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
16390 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
163a0 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
163b0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
163c0 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
163d0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
163e0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
163f0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
16400 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
16410 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
16420 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
16430 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
16440 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
16450 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
16460 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
16470 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
16480 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
16490 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
164a0 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
164b0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
164c0 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
164d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
164e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
164f0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16500 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
16510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16530 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
16540 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
16550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16560 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
16570 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
16580 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
16590 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
165a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
165b0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
165c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
165d0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
165e0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
165f0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16620 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
16630 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56  , iBreak, -1); V
16640 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16650 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
16660 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
16670 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
16680 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16690 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
166a0 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
166b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
166c0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
166d0 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
166e0 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
166f0 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
16700 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
16710 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
16720 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
16730 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
16740 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
16750 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
16760 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16770 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
16780 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
16790 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
167a0 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
167b0 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
167c0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
167d0 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
167e0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
167f0 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
16800 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
16810 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
16820 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
16830 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
16840 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
16850 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
16860 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
16870 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
16880 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
16890 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
168a0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
168b0 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
168c0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
168d0 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
168e0 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
168f0 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
16900 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
16910 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
16920 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
16930 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
16940 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
16950 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
16960 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
16970 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
16980 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
16990 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
169a0 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
169b0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
169c0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
169d0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
169e0 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
169f0 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
16a00 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
16a10 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
16a20 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
16a30 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
16a40 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
16a50 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
16a60 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
16a70 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
16a80 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
16a90 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
16aa0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
16ab0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
16ac0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
16ad0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
16ae0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
16af0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
16b00 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
16b10 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
16b20 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
16b30 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
16b40 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
16b50 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
16b60 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
16b70 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
16b80 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
16b90 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
16ba0 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
16bb0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
16bc0 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
16bd0 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
16be0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16bf0 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
16c00 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
16c10 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
16c20 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
16c30 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
16c40 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
16c50 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
16c60 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
16c70 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
16c80 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
16c90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16cb0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16cc0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16cd0 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
16ce0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16cf0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16d00 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16d10 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
16d20 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
16d30 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16d40 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
16d50 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
16d60 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
16d70 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
16d80 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16d90 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
16da0 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
16db0 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
16dc0 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
16dd0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
16de0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
16df0 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
16e00 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
16e10 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
16e20 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
16e30 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
16e40 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
16e50 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
16e60 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
16e70 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
16e80 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
16e90 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
16ea0 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
16eb0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16ec0 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
16ed0 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
16ee0 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
16ef0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
16f00 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
16f10 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
16f20 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
16f30 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
16f40 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
16f50 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
16f60 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
16f70 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
16f80 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
16f90 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
16fa0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
16fb0 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
16fc0 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
16fd0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
16fe0 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
16ff0 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
17000 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
17010 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
17020 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
17030 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
17040 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
17050 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
17060 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
17070 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
17080 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
17090 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
170a0 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
170b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
170c0 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
170d0 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
170e0 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
170f0 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
17100 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
17110 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
17120 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
17130 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
17140 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
17150 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
17160 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
17170 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
17180 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
17190 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
171a0 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
171b0 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
171c0 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
171d0 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
171e0 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
171f0 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
17200 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
17210 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
17220 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
17230 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
17240 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
17250 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
17260 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
17270 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
17280 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17290 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
172a0 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
172b0 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
172c0 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
172d0 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
172e0 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
172f0 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
17300 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
17310 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
17320 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
17330 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
17340 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
17350 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
17360 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
17370 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
17380 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
17390 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
173a0 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
173b0 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
173c0 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
173d0 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
173e0 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
173f0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
17400 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
17410 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
17420 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
17430 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
17440 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
17450 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17460 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
17470 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
17480 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
17490 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
174a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
174b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
174c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
174d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
174e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
174f0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
17500 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
17510 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
17520 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
17530 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
17540 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
17550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17560 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
17570 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
17580 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
17590 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
175a0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
175b0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
175c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
175d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
175e0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
175f0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
17600 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
17610 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
17620 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
17630 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
17640 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
17650 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
17660 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
17670 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
17680 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17690 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
176a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
176b0 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
176c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
176d0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
176e0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
176f0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
17700 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
17710 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
17720 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
17730 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
17740 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
17750 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
17760 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
17770 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
17780 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17790 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
177a0 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
177b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
177c0 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
177d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
177e0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
177f0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
17800 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
17810 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
17820 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of 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 61 64 64  ine */.  int add
17850 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
17860 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17870 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
17880 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17890 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
178a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
178b0 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
178c0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
178d0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
178e0 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
178f0 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
17900 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
17910 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
17920 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
17930 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17940 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
17950 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
17960 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
17970 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
17980 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17990 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
179a0 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
179b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
179c0 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
179d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
179e0 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
179f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17a00 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
17a10 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17a20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
17a30 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
17a40 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
17a50 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
17a60 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
17a70 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
17a80 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
17a90 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
17aa0 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
17ab0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
17ac0 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
17ad0 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
17ae0 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
17af0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17b00 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
17b10 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
17b20 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
17b30 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
17b40 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
17b50 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
17b60 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
17b70 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
17b80 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
17b90 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
17ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
17bb0 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
17bc0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
17bd0 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
17be0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
17bf0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
17c00 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
17c10 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
17c20 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
17c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
17c40 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
17c50 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
17c60 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
17c70 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
17c80 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
17c90 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
17ca0 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
17cb0 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
17cc0 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
17cd0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
17ce0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
17cf0 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
17d00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
17d10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17d20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17d30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17d40 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
17d50 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17d60 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
17d70 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
17d80 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17d90 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
17da0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
17db0 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
17dc0 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
17dd0 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
17de0 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
17df0 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
17e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
17e10 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
17e20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
17e30 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
17e40 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
17e50 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
17e60 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
17e70 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
17e80 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
17e90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17ea0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
17eb0 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
17ec0 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
17ed0 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
17ee0 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
17ef0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
17f00 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
17f10 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
17f20 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
17f30 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
17f40 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
17f50 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
17f60 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
17f70 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
17f80 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
17f90 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
17fa0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17fb0 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
17fc0 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
17fd0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
17fe0 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
17ff0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
18000 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
18010 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
18020 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
18030 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18040 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
18050 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
18060 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
18070 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
18080 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
18090 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
180a0 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
180b0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
180c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
180d0 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
180e0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
180f0 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
18100 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
18110 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
18120 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
18130 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
18140 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
18150 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18160 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
18170 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18180 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
18190 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
181a0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
181b0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
181c0 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
181d0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
181e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
181f0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18200 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
18210 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
18220 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
18230 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
18240 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
18250 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
18260 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
18270 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
18280 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
18290 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
182a0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
182b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
182c0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
182d0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
182e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
182f0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
18300 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
18310 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
18320 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
18330 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
18340 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
18350 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
18360 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
18370 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
18380 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
18390 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
183a0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
183b0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
183c0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
183d0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
183e0 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
183f0 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
18400 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
18410 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
18420 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
18430 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
18440 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
18450 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
18460 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
18470 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18480 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
18490 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
184a0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
184b0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
184c0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
184d0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
184e0 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
184f0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
18500 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
18510 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
18520 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
18530 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
18540 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
18550 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
18560 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
18570 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
18580 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
18590 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
185a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
185b0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
185c0 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20  erByCol>0.      
185d0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e      && pItem->u.
185e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
185f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
18600 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
18610 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
18620 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
18630 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
18640 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
18650 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
18660 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
18670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18680 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
18690 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
186a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
186b0 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
186c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
186d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
186e0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
186f0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
18700 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
18710 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
18720 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
18730 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
18740 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
18750 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
18760 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
18770 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
18780 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
18790 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
187a0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
187b0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
187c0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
187d0 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
187e0 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
187f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
18800 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
18810 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18820 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
18830 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
18840 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
18850 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
18860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18870 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
18880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18890 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
188a0 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
188b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
188c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
188d0 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
188e0 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
188f0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
18900 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
18910 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
18920 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18930 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
18940 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
18950 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
18960 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
18970 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
18980 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
18990 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
189a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
189b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
189c0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
189d0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
189e0 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
189f0 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
18a00 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
18a10 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
18a20 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
18a30 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
18a40 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
18a50 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
18a60 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
18a70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
18a80 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
18a90 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
18aa0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
18ab0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18ac0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18ad0 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
18ae0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
18af0 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
18b00 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
18b10 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
18b20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
18b30 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
18b40 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
18b50 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
18b60 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
18b70 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
18b80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18b90 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
18ba0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18bb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18bc0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18bd0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
18be0 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
18bf0 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
18c20 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
18c30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18c40 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
18c50 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
18c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
18c70 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
18c80 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
18c90 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
18ca0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
18cb0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18cd0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
18ce0 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
18cf0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
18d00 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
18d10 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
18d20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
18d30 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
18d40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18d50 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
18d60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
18d70 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
18d80 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
18d90 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18da0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
18db0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
18dc0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
18dd0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
18de0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
18df0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
18e00 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
18e10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
18e20 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
18e30 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
18e40 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
18e50 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
18e60 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
18e70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18e80 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d  r(v) + 1;.  j1 =
18e90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ea0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
18eb0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18ec0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
18ed0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
18ee0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
18ef0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
18f00 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
18f10 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
18f20 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
18f30 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
18f40 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
18f50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18f60 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
18f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f80 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
18f90 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18fb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
18fc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18fd0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
18fe0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
18ff0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
19000 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
19010 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
19020 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
19030 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
19040 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
19050 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69  + 1;.  j1 = sqli
19060 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19070 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19080 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
19090 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
190a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
190b0 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
190c0 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
190d0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
190e0 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
190f0 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
19100 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
19110 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
19120 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
19130 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
19140 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
19150 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
19160 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
19170 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
19180 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
19190 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
191a0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
191b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
191c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
191d0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
191e0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
191f0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19200 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
19210 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
19220 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
19230 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
19240 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
19250 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19260 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
19270 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19280 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19290 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
192a0 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
192b0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
192c0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
192d0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
192e0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
192f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19300 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19310 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19320 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
19330 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19340 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
19350 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
19360 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
19370 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19380 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19390 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
193a0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
193b0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
193c0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
193d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
193e0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
193f0 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
19400 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
19410 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
19420 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
19430 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
19440 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
19450 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
19460 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
19470 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
19480 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19490 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
194a0 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
194b0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
194c0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
194d0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
194e0 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
194f0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
19500 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
19510 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
19520 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19530 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
19540 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
19550 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
19560 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
19570 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
19580 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
19590 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
195a0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
195b0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
195c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
195d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
195e0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
195f0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
19600 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
19610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19620 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
19630 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
19660 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19670 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19680 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19690 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
196a0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
196b0 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
196c0 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
196d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
196e0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
196f0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
19700 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
19710 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
19720 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
19730 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
19740 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
19750 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
19760 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
19770 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
19780 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
19790 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
197a0 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
197b0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
197c0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
197d0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
197e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
197f0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
19800 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
19810 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
19820 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
19830 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
19840 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
19850 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19860 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19870 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
19880 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19890 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
198a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
198b0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
198c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
198d0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
198e0 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
198f0 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
19900 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
19910 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
19920 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
19930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19940 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19950 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
19960 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
19970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19980 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19990 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
199a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
199b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
199c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
199d0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
199e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
199f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
19a00 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
19a10 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19a20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
19a30 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
19a40 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
19a50 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19a60 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
19a70 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
19a80 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
19a90 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19aa0 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
19ab0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19ac0 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
19ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ae0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19af0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19b00 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
19b10 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19b20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19b30 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
19b40 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
19b50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19b60 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19b70 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
19b80 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19b90 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
19ba0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
19bb0 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
19bc0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19bd0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
19be0 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
19bf0 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
19c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19c10 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
19c20 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
19c30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19c40 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19c50 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
19c60 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
19c70 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
19c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19c90 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19ca0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
19cb0 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
19cc0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
19cd0 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
19ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19cf0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
19d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d10 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19d20 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19d30 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
19d40 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
19d50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19d60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19d70 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
19d80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19d90 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
19da0 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
19db0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
19dc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19dd0 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
19de0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19df0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
19e00 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
19e10 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
19e20 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
19e30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19e40 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
19e50 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
19e60 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
19e70 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
19ea0 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
19eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19ec0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19ed0 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
19ee0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19ef0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
19f00 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
19f10 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
19f20 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
19f30 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
19f40 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
19f50 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
19f60 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
19f70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19f80 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
19f90 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
19fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
19fb0 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
19fc0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
19fd0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
19fe0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
19ff0 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
1a000 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
1a010 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
1a020 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
1a030 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
1a040 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1a050 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
1a060 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1a070 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1a080 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1a090 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1a0a0 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1a0b0 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1a0c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a0d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1a0e0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1a0f0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1a100 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1a110 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1a120 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1a130 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1a140 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1a150 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1a160 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1a170 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1a180 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1a190 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
1a1a0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
1a1b0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
1a1c0 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
1a1d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a1e0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
1a1f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a200 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1a210 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1a220 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1a230 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1a240 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1a250 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1a260 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
1a270 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
1a280 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
1a290 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1a2a0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
1a2b0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
1a2c0 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
1a2d0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
1a2e0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
1a2f0 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
1a300 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
1a310 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
1a320 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
1a330 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1a340 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
1a350 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
1a360 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
1a370 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1a380 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
1a390 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
1a3a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a3b0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
1a3c0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
1a3d0 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
1a3e0 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
1a3f0 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
1a400 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
1a410 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
1a420 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
1a430 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
1a440 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
1a450 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
1a460 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
1a470 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
1a480 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
1a490 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
1a4a0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1a4b0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1a4c0 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1a4d0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1a4e0 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1a4f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a500 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1a510 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1a520 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1a530 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1a540 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a550 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1a560 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1a570 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
1a580 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1a590 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
1a5a0 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1a5b0 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1a5c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1a5d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
1a5e0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1a5f0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1a600 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
1a610 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
1a620 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
1a630 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1a640 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a650 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a660 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1a670 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
1a680 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a690 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1a6a0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1a6b0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
1a6c0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
1a6d0 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
1a6e0 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
1a6f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
1a700 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1a720 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
1a730 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
1a740 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
1a750 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a760 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
1a770 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1a780 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
1a790 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1a7a0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1a7b0 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1a7c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a7d0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1a7e0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a7f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
1a800 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a810 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1a820 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1a830 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1a840 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a850 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
1a860 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a870 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1a880 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1a890 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
1a8a0 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
1a8b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1a8d0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1a8e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1a8f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a900 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a910 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1a920 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1a930 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1a940 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1a950 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1a960 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1a970 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1a980 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1a990 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1a9a0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1a9b0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1a9c0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1a9d0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1a9e0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1a9f0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1aa00 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1aa10 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1aa20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1aa30 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1aa40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1aa50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1aa60 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1aa70 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1aa80 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1aa90 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1aaa0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1aab0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1aac0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1aad0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1aae0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1aaf0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1ab00 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1ab10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1ab20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1ab30 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1ab40 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1ab50 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1ab60 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1ab70 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1ab80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1ab90 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1aba0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1abb0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1abc0 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1abd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1abe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1abf0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1ac00 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ac10 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1ac20 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ac30 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ac40 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
1ac50 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1ac60 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ac70 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1ac80 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ac90 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
1aca0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1acb0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1acc0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
1acd0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1ace0 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
1acf0 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
1ad00 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
1ad10 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
1ad20 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ad30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1ad40 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1ad50 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
1ad60 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
1ad70 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
1ad80 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
1ad90 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
1ada0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
1adb0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1adc0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1add0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1ade0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1adf0 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
1ae00 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1ae10 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1ae20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1ae30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ae40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1ae50 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1ae60 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1ae70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1ae80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ae90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1aea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1aeb0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1aec0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1aed0 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1aee0 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1aef0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1af00 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1af10 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1af20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1af30 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1af40 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1af50 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1af60 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1af70 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1af80 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1af90 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1afa0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1afb0 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1afc0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1afd0 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1afe0 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1aff0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1b000 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1b010 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1b020 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1b030 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1b040 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1b050 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1b060 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1b070 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1b080 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1b090 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1b0a0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1b0b0 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1b0c0 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1b0d0 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1b0e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1b0f0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1b100 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1b110 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1b120 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1b130 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1b140 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1b150 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1b160 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1b170 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1b180 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1b190 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1b1a0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1b1b0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1b1c0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b1d0 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1b1e0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1b1f0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1b200 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74  this simplificat
1b210 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
1b220 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
1b230 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
1b240 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
1b250 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
1b260 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
1b270 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
1b280 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
1b290 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
1b2a0 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
1b2b0 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
1b2c0 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
1b2d0 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
1b2e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1b2f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1b300 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
1b310 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1b320 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1b330 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
1b340 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1b350 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1b360 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1b370 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
1b380 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1b390 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1b3a0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1b3b0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1b3c0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1b3d0 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
1b3e0 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
1b3f0 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
1b400 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20  .  Strengthened 
1b410 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
1b420 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
1b430 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1b440 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  t DISTINCT..**.*
1b450 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1b460 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1b470 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1b480 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1b490 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1b4a0 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1b4b0 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1b4c0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1b4d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1b4e0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1b4f0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1b500 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1b510 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1b520 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1b530 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
1b540 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b550 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1b560 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1b570 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1b580 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1b590 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1b5a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
1b5b0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
1b5c0 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62    TODO:  For sub
1b5d0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a  queries without.
1b5e0 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d  **        A FROM
1b5f0 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65   clause, conside
1b600 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20  r adding a FROM 
1b610 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73  close with the s
1b620 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1b630 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1b640 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1b650 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1b660 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1b670 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1b680 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1b690 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b6a0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1b6b0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1b6c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1b6d0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1b6e0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b6f0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1b700 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b710 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b720 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
1b730 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
1b740 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
1b750 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1b760 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1b770 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1b780 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
1b790 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1b7a0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1b7b0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1b7c0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1b7d0 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1b7e0 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1b7f0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1b800 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1b810 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1b820 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1b830 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1b840 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1b850 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1b860 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1b870 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1b880 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b890 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
1b8a0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
1b8b0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
1b8c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1b8d0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
1b8e0 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1b8f0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1b900 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
1b910 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1b920 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
1b930 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
1b940 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
1b950 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
1b960 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
1b970 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
1b980 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
1b990 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
1b9a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1b9b0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1b9c0 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
1b9d0 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
1b9e0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
1b9f0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
1ba00 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
1ba10 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
1ba20 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
1ba30 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
1ba40 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
1ba50 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
1ba60 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
1ba70 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1ba80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1ba90 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
1baa0 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
1bab0 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
1bac0 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
1bad0 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
1bae0 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
1baf0 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
1bb00 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
1bb10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1bb20 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
1bb30 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1bb40 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
1bb50 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
1bb60 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
1bb70 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
1bb80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1bb90 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a  s not a join.**.
1bba0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1bbb0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1bbc0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1bbd0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1bbe0 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1bbf0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1bc00 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1bc10 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1bc20 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1bc30 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1bc40 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1bc50 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1bc60 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1bc70 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1bc80 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1bc90 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1bca0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1bcb0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1bcc0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1bcd0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1bce0 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1bcf0 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1bd00 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1bd10 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1bd20 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1bd30 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1bd40 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1bd50 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1bd60 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1bd70 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1bd80 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1bd90 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1bda0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1bdb0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1bdc0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1bdd0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1bde0 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1bdf0 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1be00 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1be10 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1be20 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1be30 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1be40 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1be50 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1be60 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1be70 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1be80 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1be90 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1bea0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1beb0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1bec0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1bed0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1bee0 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74  R by clause of t
1bef0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1bf00 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1bf10 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1bf20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1bf30 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1bf40 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62  *  (19)  The sub
1bf50 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1bf60 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1bf70 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1bf80 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1bf90 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1bfa0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1bfb0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1bfc0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1bfd0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1bfe0 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1bff0 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1c000 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1c010 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1c020 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1c030 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1c040 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1c050 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1c060 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1c070 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1c080 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1c090 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1c0a0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1c0b0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1c0c0 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1c0d0 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1c0e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1c0f0 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1c100 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1c110 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
1c120 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c130 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1c140 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c150 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1c160 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
1c170 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
1c180 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32  fc])..**.**  (22
1c190 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c1a0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1c1b0 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
1c1c0 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20  23)  The parent 
1c1d0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
1c1e0 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73  ve CTE, or the s
1c1f0 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1c200 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70  a.**        comp
1c210 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73  ound query. This
1c220 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20   restriction is 
1c230 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72  because transfor
1c240 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20  ming the.**     
1c250 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63     parent to a c
1c260 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f  ompound query co
1c270 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20  nfuses the code 
1c280 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20  that handles.** 
1c290 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65         recursive
1c2a0 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74   queries in mult
1c2b0 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a  iSelect()..**.**
1c2c0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1c2d0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1c2e0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1c2f0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1c300 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1c310 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1c320 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1c330 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1c340 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1c350 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1c360 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1c370 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1c380 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1c390 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1c3a0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1c3b0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1c3c0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1c3d0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1c3e0 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1c3f0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1c400 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1c410 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1c420 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1c430 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1c440 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1c450 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1c460 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1c470 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1c480 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1c490 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1c4a0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1c4b0 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1c4c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1c4d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1c4e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1c4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c500 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1c510 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c520 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1c530 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1c540 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1c550 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1c560 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1c570 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1c580 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c590 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1c5a0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1c5b0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1c5c0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1c5d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1c5e0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1c5f0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c600 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1c610 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1c620 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1c630 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1c640 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1c650 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
1c660 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1c670 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1c680 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1c690 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1c6a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1c6b0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1c6c0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1c6d0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1c6e0 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1c6f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1c700 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c710 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c720 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1c730 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c740 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1c750 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c760 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1c770 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1c780 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1c790 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1c7a0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1c7b0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1c7c0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1c7d0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1c7e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1c7f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1c800 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1c810 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1c820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c830 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1c840 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c850 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1c860 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1c870 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1c880 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c890 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1c8a0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1c8b0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1c8c0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1c8d0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1c8e0 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1c8f0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1c900 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1c910 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1c920 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1c930 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1c940 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1c950 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1c960 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1c970 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1c980 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1c990 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1c9a0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1c9b0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1c9c0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1c9d0 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1c9e0 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1c9f0 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1ca00 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1ca10 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1ca20 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
1ca30 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
1ca40 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
1ca70 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
1ca80 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
1ca90 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
1caa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1cab0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
1cac0 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
1cad0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
1cae0 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
1caf0 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
1cb00 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
1cb10 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1cb20 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
1cb30 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
1cb40 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
1cb50 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1cb60 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
1cb70 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
1cb80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1cb90 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
1cba0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
1cbb0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1cbc0 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
1cbd0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1cbe0 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
1cbf0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1cc00 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
1cc10 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
1cc20 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
1cc30 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
1cc40 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1cc50 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
1cc60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1cc70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cc80 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
1cc90 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
1cca0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ccd0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
1cce0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1ccf0 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20  SF_Compound)!=0 
1cd00 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
1cd10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cd50 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
1cd60 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1cd70 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
1cd80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cdb0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  7)  */.  if( pSu
1cdc0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1cdd0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1cde0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cdf0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ce00 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  5)  */.  if( pSu
1ce10 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53  b->pLimit && (pS
1ce20 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
1ce30 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
1ce40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1ce50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1ce60 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  8)(9) */.  }.  i
1ce70 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1ce80 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1ce90 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  0 && subqueryIsA
1cea0 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  gg ){.     retur
1ceb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1cec0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  Restriction (6) 
1ced0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   */.  }.  if( p-
1cee0 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
1cef0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1cf00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cf40 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
1cf50 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
1cf60 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1cf70 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cf90 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
1cfa0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cfb0 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65  Limit && p->pWhe
1cfc0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cfe0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20  estriction (19) 
1cff0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d000 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c  Limit && (p->sel
1d010 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1d020 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  nct)!=0 ){.     
1d030 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d040 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d050 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (21) */.  }.  i
1d060 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1d070 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1d080 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d090 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d0a0 74 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20  tion (22)  */.  
1d0b0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1d0c0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
1d0d0 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72   && pSub->pPrior
1d0e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d0f0 20 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a     /* (23)  */..
1d100 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    /* OBSOLETE CO
1d110 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65  MMENT 1:.  ** Re
1d120 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
1d130 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d140 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
1d150 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1d160 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
1d170 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
1d180 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
1d190 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
1d1a0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
1d1b0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
1d1c0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1d1d0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1d1e0 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1d1f0 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1d200 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1d210 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1d220 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1d230 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1d240 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1d250 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1d260 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1d270 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1d280 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
1d290 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1d2a0 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   2:.  ** Restric
1d2b0 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
1d2c0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d2d0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d2e0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
1d2f0 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
1d300 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1d310 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
1d320 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
1d330 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1d340 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
1d350 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1d360 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1d370 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
1d380 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
1d390 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
1d3a0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1d3b0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1d3c0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1d3d0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1d3e0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1d3f0 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
1d400 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
1d410 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
1d420 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
1d430 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
1d440 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
1d450 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
1d460 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
1d470 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
1d480 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  JOIN..  **.  ** 
1d490 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f  THIS OVERRIDES O
1d4a0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53  BSOLETE COMMENTS
1d4b0 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a   1 AND 2 ABOVE:.
1d4c0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30    ** Ticket #330
1d4d0 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61  0 shows that fla
1d4e0 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68  ttening the righ
1d4f0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1d500 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72   JOIN.  ** is fr
1d510 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65  aught with dange
1d520 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69  r.  Best to avoi
1d530 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e  d the whole thin
1d540 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  g.  If the.  ** 
1d550 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d560 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1d570 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
1d580 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a  do not flatten..
1d590 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
1d5a0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
1d5b0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
1d5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d5d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
1d5e0 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
1d5f0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1d600 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1d610 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1d620 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1d630 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1d640 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1d650 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1d660 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1d670 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1d680 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1d690 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1d6a0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1d6b0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1d6c0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1d6d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1d6e0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1d6f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1d700 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1d710 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
1d720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
1d730 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
1d740 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1d750 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
1d760 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1d770 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1d780 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1d790 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1d7a0 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1d7b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d7c0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1d7d0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1d7e0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1d7f0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
1d800 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d810 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1d820 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1d830 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1d840 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
1d850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1d860 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
1d870 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
1d880 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1d890 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1d8a0 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
1d8b0 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
1d8c0 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
1d8d0 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
1d8e0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1d8f0 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20  ->nSrc<1.       
1d900 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  || pSub->pEList-
1d910 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70  >nExpr!=pSub1->p
1d920 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
1d930 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1d940 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1d950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d960 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1d970 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1d980 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d990 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1d9a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1d9b0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1d9c0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1d9d0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1d9e0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1d9f0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1da00 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1da10 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1da20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1da30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1da40 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1da50 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1da60 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1da70 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20  tted. *****/..  
1da80 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
1da90 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
1daa0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1dab0 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
1dac0 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
1dad0 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
1dae0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1daf0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1db00 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
1db10 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
1db20 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
1db30 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1db40 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1db50 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
1db60 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1db70 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
1db80 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
1db90 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
1dba0 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
1dbb0 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
1dbc0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
1dbd0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1dbe0 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
1dbf0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
1dc00 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1dc10 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
1dc20 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
1dc30 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
1dc40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
1dc50 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
1dc60 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
1dc70 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
1dc80 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
1dc90 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
1dca0 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
1dcb0 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
1dcc0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
1dcd0 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
1dce0 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
1dcf0 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
1dd00 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
1dd10 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1dd20 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
1dd30 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
1dd40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
1dd50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1dd60 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
1dd70 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
1dd80 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
1dd90 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
1dda0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1ddb0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1ddc0 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
1ddd0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1dde0 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
1ddf0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1de00 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1de10 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
1de20 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1de30 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1de40 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
1de50 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
1de60 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
1de70 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
1de80 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
1de90 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
1dea0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1deb0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
1dec0 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
1ded0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1dee0 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
1def0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
1df00 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
1df10 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1df20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1df30 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
1df40 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
1df50 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
1df60 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
1df70 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
1df80 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
1df90 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
1dfa0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
1dfb0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
1dfc0 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
1dfd0 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
1dfe0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
1dff0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1e000 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1e010 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
1e020 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
1e030 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
1e040 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
1e050 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
1e060 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1e070 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1e080 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
1e090 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
1e0a0 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
1e0b0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  imit = 0;.    p-
1e0c0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
1e0d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1e0e0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
1e0f0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66   0);.    p->pOff
1e100 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
1e110 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
1e120 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
1e130 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1e140 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
1e150 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
1e160 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
1e170 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1e180 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1e190 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
1e1a0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
1e1b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1e1c0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
1e1d0 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
1e1e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
1e1f0 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
1e200 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1e210 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1e220 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1e230 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1e240 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
1e250 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
1e260 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
1e270 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1e280 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
1e290 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1e2a0 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
1e2b0 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
1e2c0 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
1e2d0 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
1e2e0 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1e2f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1e300 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1e310 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1e320 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1e330 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1e340 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1e350 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1e360 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
1e370 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1e380 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
1e390 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
1e3a0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
1e3b0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1e3c0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
1e3d0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
1e3e0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
1e3f0 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
1e400 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
1e410 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
1e420 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1e430 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
1e440 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1e450 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
1e460 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
1e470 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
1e480 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
1e490 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
1e4a0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1e4b0 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
1e4c0 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
1e4d0 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
1e4e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1e4f0 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
1e500 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
1e510 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
1e520 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
1e530 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
1e540 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
1e550 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1e560 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
1e570 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
1e580 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
1e590 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
1e5a0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1e5b0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1e5c0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1e5d0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
1e5e0 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
1e5f0 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1e600 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
1e610 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
1e620 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
1e630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
1e640 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
1e650 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
1e660 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
1e670 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1e680 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
1e690 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
1e6a0 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
1e6b0 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
1e6c0 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
1e6d0 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
1e6e0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1e6f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
1e700 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
1e710 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
1e720 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1e730 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1e740 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
1e750 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
1e760 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1e770 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
1e780 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
1e790 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1e7a0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1e7b0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1e7c0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1e7d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1e7e0 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
1e7f0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
1e800 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
1e810 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1e820 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
1e830 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
1e840 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
1e850 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
1e860 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
1e870 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
1e880 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
1e890 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
1e8a0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
1e8b0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
1e8c0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
1e8d0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
1e8e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1e8f0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1e900 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1e910 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1e920 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
1e930 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
1e940 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
1e950 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
1e960 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
1e970 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
1e980 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1e990 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
1e9a0 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
1e9b0 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
1e9c0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1e9d0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1e9e0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
1e9f0 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
1ea00 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
1ea10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1ea20 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
1ea30 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1ea40 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1ea50 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
1ea60 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ea70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1ea80 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
1ea90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1eaa0 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
1eab0 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
1eac0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1ead0 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
1eae0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
1eaf0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1eb00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1eb10 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1eb20 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1eb30 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1eb40 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1eb50 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1eb60 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1eb70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1eb80 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1eb90 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1eba0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1ebb0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1ebc0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1ebd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ebe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1ebf0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1ec00 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1ec10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ec20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1ec30 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1ec40 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1ec50 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1ec60 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1ec70 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1ec80 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1ec90 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1eca0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1ecb0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1ecc0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1ecd0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1ece0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1ecf0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1ed00 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1ed10 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1ed20 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1ed30 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1ed40 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1ed50 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1ed60 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1ed70 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1ed80 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1ed90 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1eda0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1edb0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1edc0 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1edd0 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1ede0 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1edf0 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1ee00 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1ee10 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1ee20 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1ee30 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1ee40 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1ee50 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1ee60 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1ee70 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1ee80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1ee90 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1eea0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1eeb0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1eec0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1eed0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1eee0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1eef0 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1ef00 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1ef10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ef20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1ef30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ef40 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1ef50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ef60 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1ef70 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1ef80 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1ef90 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1efa0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1efb0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1efc0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1efd0 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1efe0 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1eff0 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1f000 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1f010 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1f020 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1f030 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1f040 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1f050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1f060 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
1f070 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
1f080 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
1f090 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
1f0a0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
1f0b0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
1f0c0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
1f0d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
1f0e0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
1f0f0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1f100 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
1f110 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1f120 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
1f130 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
1f140 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
1f150 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
1f160 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
1f170 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1f180 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1f190 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1f1a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
1f1b0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
1f1c0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1f1d0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1f1e0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1f1f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f200 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
1f210 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
1f220 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1f230 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f240 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1f250 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
1f260 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
1f270 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
1f280 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
1f290 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1f2a0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
1f2b0 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
1f2c0 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
1f2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1f2e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1f2f0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1f300 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
1f310 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1f320 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
1f330 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
1f340 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1f350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1f360 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
1f370 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1f380 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1f390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f3a0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f3b0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
1f3c0 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
1f3d0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1f3e0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
1f3f0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1f400 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1f410 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
1f420 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f430 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f440 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1f450 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1f460 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1f470 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f490 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f4a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1f4b0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1f4c0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1f4d0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1f4e0 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1f4f0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1f500 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1f510 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1f520 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1f530 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f540 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1f550 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1f560 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f570 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f580 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1f590 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1f5a0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1f5b0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1f5c0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1f5d0 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1f5e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f5f0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1f600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f610 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1f620 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1f630 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1f640 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1f650 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f660 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1f670 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f680 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1f690 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1f6a0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1f6b0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1f6c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f6d0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1f6e0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1f6f0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1f730 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1f740 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1f750 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1f760 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1f770 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1f780 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1f790 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1f7a0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1f7b0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1f7c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1f7d0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1f7e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1f7f0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1f800 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1f810 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1f820 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1f830 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1f840 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1f850 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1f860 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1f870 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1f880 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1f890 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1f8a0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1f8b0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1f8c0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1f8d0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1f8e0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f8f0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1f900 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1f910 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1f920 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1f930 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1f940 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1f950 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1f960 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1f970 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1f980 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1f990 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
1f9a0 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
1f9b0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
1f9c0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
1f9d0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
1f9e0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f9f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1fa00 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
1fa10 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
1fa20 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
1fa30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1fa40 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1fa50 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1fa60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1fa70 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1fa80 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1fa90 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1faa0 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
1fab0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1fac0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1fad0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1fae0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1faf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1fb00 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
1fb10 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1fb20 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
1fb30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
1fb40 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1fb50 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
1fb60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1fb70 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
1fb80 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1fb90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
1fba0 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
1fbb0 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
1fbc0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1fbd0 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
1fbe0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1fbf0 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
1fc00 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
1fc10 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
1fc20 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
1fc30 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1fc40 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
1fc50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
1fc60 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
1fc70 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
1fc80 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1fc90 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1fca0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1fcb0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
1fcc0 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
1fcd0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1fce0 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
1fcf0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1fd00 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
1fd10 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
1fd20 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
1fd30 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
1fd40 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
1fd50 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
1fd60 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
1fd70 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
1fd80 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
1fd90 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
1fda0 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
1fdb0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
1fdc0 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
1fdd0 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
1fde0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1fdf0 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
1fe00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1fe10 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
1fe20 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
1fe30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
1fe40 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
1fe50 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
1fe60 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
1fe70 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
1fe80 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
1fe90 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1fea0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
1feb0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1fec0 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
1fed0 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
1fee0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1fef0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
1ff00 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
1ff10 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
1ff20 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
1ff30 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
1ff40 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1ff50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ff60 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
1ff70 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1ff80 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1ff90 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
1ffa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1ffb0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1ffc0 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
1ffd0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1ffe0 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
1fff0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
20000 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
20010 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20020 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
20030 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
20040 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
20050 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20060 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
20070 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
20080 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
20090 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
200a0 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
200b0 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
200c0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
200d0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
200e0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
200f0 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
20100 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
20110 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
20120 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
20130 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
20140 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
20150 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
20160 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
20170 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
20180 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
20190 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
201a0 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
201b0 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
201c0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
201d0 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
201e0 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
201f0 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
20200 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
20210 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
20220 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
20230 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
20240 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
20250 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
20260 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
20270 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
20280 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
20290 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
202a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
202b0 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
202c0 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
202d0 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
202e0 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
202f0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
20300 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
20310 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
20320 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
20330 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
20340 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
20350 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
20360 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
20370 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
20380 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
20390 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
203a0 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
203b0 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
203c0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
203d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
203e0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
203f0 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
20400 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
20410 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
20420 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
20430 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
20440 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
20450 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  uncFlags&SQLITE_
20460 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
20470 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
20480 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
20490 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
204a0 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
204b0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
204c0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
204d0 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
204e0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
204f0 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
20500 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
20510 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
20520 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
20530 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
20540 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
20550 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
20560 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
20570 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
20580 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
20590 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
205a0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
205b0 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
205c0 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
205d0 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
205e0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
205f0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
20600 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
20610 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
20620 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
20630 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
20640 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
20650 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
20660 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
20670 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
20680 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
20690 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
206a0 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
206b0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
206c0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
206d0 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
206e0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
206f0 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
20700 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
20710 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
20720 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
20730 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
20740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20750 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
20760 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
20770 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
20780 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
20790 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
207a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
207b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
207c0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
207d0 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
207e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
207f0 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
20800 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
20810 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
20820 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20830 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
20840 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
20850 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
20860 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
20870 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
20880 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
20890 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
208a0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
208b0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
208c0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
208d0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
208e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
208f0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
20900 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
20910 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
20920 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
20930 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
20940 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
20950 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
20960 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
20970 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
20980 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
20990 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
209a0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
209b0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
209c0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
209d0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
209e0 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
209f0 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
20a00 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
20a10 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
20a20 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
20a30 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
20a40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20a50 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
20a60 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
20a70 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
20a80 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
20a90 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
20aa0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
20ab0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
20ac0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
20ad0 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
20ae0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
20af0 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
20b00 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
20b10 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
20b20 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
20b30 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
20b40 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
20b50 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
20b60 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
20b70 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
20b80 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
20b90 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
20ba0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
20bb0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
20bc0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
20bd0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20be0 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
20bf0 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
20c00 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
20c10 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
20c20 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
20c30 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20c40 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
20c50 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
20c60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
20c70 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
20c80 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
20c90 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
20ca0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
20cb0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
20cc0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
20cd0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
20ce0 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
20cf0 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
20d00 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
20d10 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
20d20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
20d30 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
20d40 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
20d50 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
20d60 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20d70 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
20d80 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
20d90 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
20da0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
20db0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
20dc0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
20dd0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
20de0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20df0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
20e00 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
20e10 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
20e20 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
20e30 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
20e40 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
20e50 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
20e60 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
20e70 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
20e80 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
20e90 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
20ea0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
20eb0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
20ec0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
20ed0 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
20ee0 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
20ef0 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
20f00 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
20f10 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
20f20 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
20f30 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30  pr(db, TK_ALL, 0
20f40 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
20f50 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
20f60 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
20f70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
20f80 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
20f90 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
20fa0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
20fb0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
20fc0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
20fd0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
20fe0 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
20ff0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
21000 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
21010 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
21020 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
21030 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
21040 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
21050 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
21060 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
21070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
21080 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
21090 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
210a0 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
210b0 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
210c0 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
210d0 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
210e0 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
210f0 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
21100 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
21110 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
21120 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
21130 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
21140 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
21150 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
21160 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
21170 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
21180 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
21190 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
211a0 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
211b0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
211c0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
211d0 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
211e0 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
211f0 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
21200 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
21210 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
21220 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
21230 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
21240 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
21250 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72  /* Current outer
21280 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
21290 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
212a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
212b0 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
212c0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
212d0 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
212e0 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21300 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
21310 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
21320 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
21330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
21340 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
21350 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
21360 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
21370 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
21380 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
21390 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
213a0 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
213b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
213c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
213d0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
213e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
213f0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
21400 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
21410 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
21420 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
21430 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
21440 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
21450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21460 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21470 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
21480 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
21490 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
214a0 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
214b0 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
214c0 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
214d0 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
214e0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
214f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21500 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
21510 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
21520 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21530 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
21540 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
21550 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
21560 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
21570 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
21580 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
21590 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
215a0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
215b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
215c0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
215d0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
215e0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
215f0 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
21600 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
21610 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
21620 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
21630 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
21640 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
21650 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
21660 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
21670 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21680 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
21690 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
216a0 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
216b0 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
216c0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  ==0 || pParse->p
216d0 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28  With==0 );.  if(
216e0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57   pWith ){.    pW
216f0 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
21700 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
21710 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
21720 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72   pWith;.    pPar
21730 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20  se->bFreeWith = 
21740 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  bFree;.  }.}../*
21750 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21760 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
21770 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
21780 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
21790 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
217a0 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
217b0 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
217c0 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
217d0 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
217e0 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
217f0 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
21800 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
21810 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
21820 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
21830 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
21840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
21850 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
21860 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
21870 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
21880 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
21890 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
218a0 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
218b0 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
218c0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
218d0 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
218e0 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
218f0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
21900 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
21910 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
21920 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
21930 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
21940 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
21950 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21960 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
21970 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
21980 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
21990 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
219a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
219b0 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
219c0 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
219d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
219e0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
219f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
21a00 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
21a10 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
21a20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21a30 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
21a40 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
21a50 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
21a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21a70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
21a80 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21aa0 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
21ab0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
21ac0 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
21ad0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
21ae0 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
21af0 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
21b00 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
21b10 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
21b20 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
21b30 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
21b40 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
21b50 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
21b60 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
21b70 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
21b80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
21b90 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
21ba0 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
21bb0 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
21bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
21bd0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
21be0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
21bf0 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
21c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21c10 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
21c20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
21c30 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
21c40 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
21c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21c60 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
21c70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
21c80 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
21c90 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  >zErr is non-NUL
21ca0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
21cb0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
21cc0 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
21cd0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
21ce0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
21cf0 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
21d00 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
21d10 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
21d20 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  y. If pCte->zErr
21d30 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
21d40 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
21d50 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
21d60 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
21d70 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
21d80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
21d90 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->zErr ){.      
21da0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21db0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45  pParse, pCte->zE
21dc0 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
21dd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21de0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
21df0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
21e00 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
21e10 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
21e20 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
21e30 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
21e40 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
21e50 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
21e60 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21e70 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
21e80 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
21e90 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
21ea0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
21eb0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
21ec0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
21ed0 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
21ee0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
21ef0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
21f00 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
21f10 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
21f20 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
21f30 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  _Ephemeral;.    
21f40 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
21f50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
21f60 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
21f70 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
21f80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21f90 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
21fa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
21fb0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
21fc0 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
21fd0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
21fe0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
21ff0 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
22000 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
22010 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
22020 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
22030 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
22040 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
22050 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
22060 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
22070 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
22080 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
22090 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
220a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
220b0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
220c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
220d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
220e0 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
220f0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
22100 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
22110 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
22120 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
22130 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
22140 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
22150 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
22160 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
22170 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22180 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
22190 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
221a0 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72    pItem->isRecur
221b0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
221c0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
221d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
221e0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
221f0 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
22200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
22220 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
22230 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
22240 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
22250 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
22260 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22270 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
22280 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
22290 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
222a0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
222b0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
222c0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
222d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
222e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
222f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
22300 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
22310 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
22320 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
22330 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
22340 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72  ..    pCte->zErr
22350 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
22360 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
22370 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
22380 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
22390 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
223a0 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69   pWith;.    sqli
223b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
223c0 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72  alker, bMayRecur
223d0 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72  sive ? pSel->pPr
223e0 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20  ior : pSel);..  
223f0 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
22400 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
22410 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
22420 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
22430 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
22440 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
22450 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
22460 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
22470 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
22480 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
22490 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
224a0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
224b0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
224c0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
224d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
224e0 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
224f0 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
22500 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
22510 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22520 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
22530 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
22540 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22550 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
22560 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
22570 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
22580 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f   }..    selectCo
22590 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
225a0 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
225b0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
225c0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
225d0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
225e0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
225f0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
22600 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
22610 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
22620 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
22630 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
22640 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
22650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22660 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65  pCte->zErr = "re
22670 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
22680 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
22690 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
226a0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
226b0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
226c0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
226d0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a  pCte->zErr = 0;.
226e0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
226f0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
22700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22720 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
22730 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
22740 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
22750 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
22760 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
22770 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
22780 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
22790 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
227a0 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
227b0 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
227c0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
227d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
227e0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
227f0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
22800 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
22810 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
22820 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
22830 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
22840 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
22850 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
22860 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
22870 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
22880 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
22890 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
228a0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
228b0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
228c0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
228d0 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
228e0 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
228f0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
22900 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
22910 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22920 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
22930 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
22940 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
22950 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
22960 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
22970 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
22980 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
22990 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
229a0 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
229b0 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
229c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
229d0 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
229e0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
229f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
22a00 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
22a10 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
22a20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
22a30 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
22a40 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
22a50 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
22a60 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
22a70 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
22a80 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
22a90 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
22aa0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
22ab0 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
22ac0 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
22ad0 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
22ae0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
22af0 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
22b00 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
22b10 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
22b20 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
22b30 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
22b40 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
22b50 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
22b60 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
22b70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
22b80 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
22b90 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
22ba0 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
22bb0 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
22bc0 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
22bd0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
22be0 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
22bf0 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
22c00 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
22c10 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
22c20 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
22c30 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
22c40 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
22c50 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
22c60 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
22c70 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
22c80 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
22c90 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
22ca0 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
22cb0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
22cc0 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
22cd0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
22ce0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
22cf0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
22d00 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
22d10 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
22d20 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
22d30 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
22d40 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
22d50 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
22d60 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
22d70 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
22d80 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
22d90 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
22da0 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
22db0 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
22dc0 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
22dd0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
22de0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
22df0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22e00 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22e10 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
22e20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22e30 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
22e40 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
22e50 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
22e60 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
22e70 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22e80 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
22e90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22ea0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
22eb0 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
22ec0 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
22ed0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
22ee0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
22ef0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
22f00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22f10 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
22f20 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22f30 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
22f40 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
22f50 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
22f60 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
22f70 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
22f80 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
22f90 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
22fa0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
22fb0 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
22fc0 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64  ush(pParse, find
22fd0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
22fe0 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
22ff0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
23000 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
23010 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
23020 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
23030 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
23040 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
23050 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
23060 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
23070 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
23080 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
23090 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
230a0 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
230b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
230c0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
230d0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
230e0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
230f0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
23100 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
23110 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
23120 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
23130 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
23140 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
23150 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
23160 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
23170 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
23180 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
23190 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
231a0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
231b0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
231c0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
231d0 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  >isRecursive==0 
231e0 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  || pFrom->pTab )
231f0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
23200 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  >isRecursive ) c
23210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23220 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
23230 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
23240 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
23250 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
23260 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
23270 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
23280 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
23290 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
232a0 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66   i==0 );.#ifndef
232b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
232c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70  .      selectPop
232d0 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29  With(pWalker, p)
232e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
232f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
23300 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
23310 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
23320 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
23330 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
23340 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
23350 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
23360 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
23370 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
23380 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
23390 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
233a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
233b0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
233c0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
233d0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
233e0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
233f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23400 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
23410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
23420 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
23430 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
23440 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
23450 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
23460 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
23470 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
23480 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
23490 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
234a0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
234b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
234c0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
234d0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
234e0 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
234f0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
23500 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
23510 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
23520 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
23530 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
23540 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
23550 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
23560 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
23570 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
23580 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
23590 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
235a0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
235b0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
235c0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
235d0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
235e0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
235f0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
23600 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
23610 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  6) );.      pTab
23620 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
23630 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
23640 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
23650 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
23660 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
23670 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
23680 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
23690 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
236a0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
236b0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
236c0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
236d0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
236e0 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
236f0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
23700 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23710 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
23720 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
23730 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
23740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23750 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
23760 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
23770 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
23780 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
23790 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
237a0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
237b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
237c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
237d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
237e0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
237f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23800 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
23810 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
23820 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
23830 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
23840 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
23850 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
23860 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
23870 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
23880 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
23890 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
238a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
238b0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
238c0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
238d0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
238e0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
238f0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23900 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
23910 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
23920 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
23930 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
23940 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
23950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
23960 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
23970 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
23980 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
23990 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
239a0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
239b0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
239c0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
239d0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
239e0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
239f0 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
23a00 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
23a10 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
23a20 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
23a30 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
23a40 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
23a50 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
23a60 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
23a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
23a80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
23a90 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
23aa0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
23ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
23ac0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
23ad0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
23ae0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
23af0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
23b00 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
23b10 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
23b20 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
23b30 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
23b40 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
23b50 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
23b60 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
23b70 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
23b80 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
23b90 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
23ba0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
23bb0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
23bc0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
23bd0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
23be0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
23bf0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
23c00 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
23c10 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
23c20 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
23c30 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
23c40 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
23c50 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
23c60 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
23c70 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
23c80 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
23c90 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
23ca0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
23cb0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
23cc0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
23cd0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
23ce0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
23cf0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
23d00 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
23d10 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
23d20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
23d30 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
23d40 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
23d50 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
23d60 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
23d70 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
23d80 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
23d90 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
23da0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
23db0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
23dc0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
23dd0 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
23de0 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
23df0 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
23e00 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
23e10 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
23e20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
23e30 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
23e40 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
23e50 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
23e60 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
23e70 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
23e80 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
23e90 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
23ea0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
23eb0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
23ec0 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
23ed0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
23ee0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23ef0 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
23f00 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
23f10 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
23f20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
23f30 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
23f40 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
23f50 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
23f60 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
23f70 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
23f90 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23fa0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
23fb0 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
23fc0 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d   processing FROM
23fd0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
23fe0 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  es, it is always
23ff0 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a   the case.    **
24000 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d   that full_colum
24010 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20  n_names=OFF and 
24020 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
24030 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20  es=ON.  The.    
24040 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  ** sqlite3Result
24050 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f  SetOfSelect() ro
24060 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73  utine makes it s
24070 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
24080 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
24090 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
240a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
240b0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
240c0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d  _FullColNames)==
240d0 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
240e0 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
240f0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
24100 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f  )!=0) );..    fo
24110 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
24120 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
24130 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
24140 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
24150 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
24160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
24170 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
24180 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
24190 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
241a0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
241b0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
241c0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
241d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
241e0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
241f0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
24200 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
24210 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
24220 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
24230 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24240 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
24250 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
24260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
24270 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
24280 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
24290 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
242a0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
242b0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
242c0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
242d0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
242e0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
242f0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
24300 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
24310 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
24320 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
24330 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
24340 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
24350 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
24360 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
24370 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
24380 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
24390 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
243a0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
243b0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
243c0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
243d0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
243e0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
243f0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
24400 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
24410 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
24420 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
24430 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
24440 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
24450 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
24460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
24470 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24480 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
24490 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
244a0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
244b0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
244c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
244d0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
244e0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
244f0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
24500 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
24510 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
24520 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
24530 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
24540 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
24550 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
24560 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24570 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
24580 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
24590 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
245a0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
245b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
245c0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
245d0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
245e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
245f0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
24600 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
24610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
24620 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24630 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24640 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
24650 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
24660 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
24670 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24680 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
24690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
246a0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
246b0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
246c0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
246e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
246f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24700 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
24710 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
24720 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
24730 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
24740 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
24750 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
24760 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
24770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24780 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
24790 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
247a0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
247b0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
247c0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
247d0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
247e0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
247f0 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
24800 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
24810 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
24820 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
24830 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
24840 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
24850 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
24860 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
24870 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
24880 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
24890 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
248a0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
248b0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
248c0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
248d0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
248e0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
248f0 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
24900 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
24910 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
24920 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
24930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24940 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24950 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
24960 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
24970 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
24980 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
24990 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
249a0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
249b0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
249c0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
249d0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
249e0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
249f0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
24a00 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
24a10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24a20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
24a30 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
24a40 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
24a50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24a60 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
24a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24a80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24aa0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
24ab0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
24ac0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
24ad0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
24ae0 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
24af0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
24b00 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
24b20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
24b30 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
24b40 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
24b50 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b70 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
24b80 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
24b90 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
24ba0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
24bb0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
24bc0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
24bd0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
24be0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
24bf0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
24c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
24c20 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
24c30 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
24c40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24c50 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
24c60 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
24c70 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
24c80 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
24c90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
24ca0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
24cb0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
24cc0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
24cd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24ce0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24d00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
24d10 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
24d20 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
24d30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
24d40 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
24d50 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
24d60 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
24d70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
24d80 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
24d90 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
24db0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
24dc0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
24dd0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
24de0 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
24df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24e00 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
24e10 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
24e20 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
24e30 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
24e40 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
24e50 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
24e60 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
24e70 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
24e80 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
24e90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24ea0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
24eb0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
24ec0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
24ed0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
24ee0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
24f00 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
24f10 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
24f20 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
24f30 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
24f40 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
24f50 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
24f60 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
24f70 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
24f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24fa0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
24fb0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
24fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24fd0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
24fe0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
24ff0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
25000 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
25010 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
25020 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
25030 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
25040 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
25050 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
25060 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25070 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
25080 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
25090 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
250a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
250b0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
250c0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
250d0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
250e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
250f0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
25100 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
25110 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
25120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
25130 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
25140 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
25150 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
25160 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
25170 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
25180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25190 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
251a0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
251b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
251e0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
251f0 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
25230 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
25240 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
25250 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25260 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
25270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25280 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
25290 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
252a0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
252b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
252c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
252d0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
252e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
252f0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
25300 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
25310 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
25320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25330 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25340 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
25350 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
25360 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
25370 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
25380 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25390 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
253a0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
253b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
253c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
253d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
253e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
253f0 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
25400 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
25410 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
25420 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
25430 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
25440 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
25450 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
25460 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
25470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25480 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25490 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
254a0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
254b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
254c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
254d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
254e0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
254f0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
25500 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
25510 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25520 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
25530 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
25540 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
25550 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
25560 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
25570 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
25580 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
25590 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
255a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
255b0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
255c0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
255d0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
255e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
255f0 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
25600 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
25610 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
25620 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
25630 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
25640 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
25650 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
25660 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
25670 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
25680 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
25690 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
256a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
256b0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
256c0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
256d0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
256e0 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
256f0 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
25700 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
25710 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
25720 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
25730 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
25740 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
25750 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
25760 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
25770 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
25780 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
25790 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
257a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
257b0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
257c0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
257d0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
257e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
257f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
25800 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
25810 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
25820 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
25830 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
25840 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
25850 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
25860 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
25870 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
25880 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
25890 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
258a0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
258b0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
258c0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
258d0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
258e0 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
258f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
25900 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
25910 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
25920 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
25930 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
25940 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
25950 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
25960 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
25970 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
25980 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
25990 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61    if( pParse->ha
259a0 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
259b0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
259c0 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
259d0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
259e0 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  uery;.    sqlite
259f0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
25a00 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
25a10 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
25a20 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
25a30 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  er;.  w.xSelectC
25a40 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
25a50 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69  tPopWith;.  sqli
25a60 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
25a70 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
25a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25a90 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
25aa0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
25ab0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
25ac0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
25ad0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
25ae0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
25af0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
25b00 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
25b10 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
25b20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
25b30 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
25b40 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
25b50 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
25b60 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
25b70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
25b80 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
25b90 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
25ba0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
25bb0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
25bc0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
25bd0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
25be0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
25bf0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
25c00 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
25c10 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
25c20 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
25c30 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
25c40 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
25c50 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
25c60 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
25c70 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
25c80 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
25c90 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
25ca0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
25cb0 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
25cc0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
25cd0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25ce0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25cf0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
25d00 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
25d10 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
25d20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25d30 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
25d40 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
25d50 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
25d60 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
25d70 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
25d80 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
25d90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
25da0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
25db0 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
25dc0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
25dd0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
25de0 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
25df0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
25e00 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
25e10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
25e20 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
25e30 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
25e40 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
25e50 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
25e60 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
25e70 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
25e80 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
25e90 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
25ea0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
25eb0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
25ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
25ed0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
25ee0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
25ef0 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
25f00 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
25f10 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
25f20 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
25f30 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  or;.          se
25f40 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
25f50 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
25f60 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
25f70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25f80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
25f90 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
25fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
25fb0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
25fc0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
25fd0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
25fe0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
25ff0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
26000 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
26010 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
26020 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26030 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
26040 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
26050 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
26060 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
26070 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
26080 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
26090 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
260a0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
260b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
260c0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
260d0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
260e0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
260f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
26100 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
26110 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
26120 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
26130 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
26140 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
26150 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
26160 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
26170 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
26180 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
26190 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
261a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
261b0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
261c0 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
261d0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
261e0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
261f0 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
26200 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
26210 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
26220 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
26230 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
26240 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
26250 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
26260 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
26270 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
26280 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
26290 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
262a0 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
262b0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
262c0 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
262d0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
262e0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
262f0 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
26300 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
26310 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
26320 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
26330 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
26340 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
26350 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
26360 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
26370 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
26380 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26390 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
263a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
263b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
263c0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
263d0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
263e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
263f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
26400 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
26410 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
26420 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
26430 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
26440 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
26450 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
26460 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
26470 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
26480 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
26490 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
264a0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
264b0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
264c0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
264d0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
264e0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
264f0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
26500 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
26510 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26520 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
26530 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
26540 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
26550 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
26560 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
26570 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
26580 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
26590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
265a0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
265b0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
265c0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
265d0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
265e0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
265f0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
26600 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
26610 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
26620 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
26630 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
26640 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
26650 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
26660 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
26670 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
26680 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
26690 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
266a0 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
266b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
266c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
266d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
266e0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
266f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
26700 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
26710 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
26720 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
26730 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
26740 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
26750 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
26760 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
26770 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
26780 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
26790 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
267a0 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
267b0 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
267c0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
267d0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
267e0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
267f0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
26800 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
26810 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
26820 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
26830 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
26840 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
26850 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
26860 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
26870 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
26880 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
26890 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
268a0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
268b0 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
268c0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
268d0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
268e0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
268f0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
26900 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
26910 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
26920 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
26930 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
26940 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
26950 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
26960 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
26970 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
26980 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
26990 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
269a0 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
269b0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
269c0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
269d0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
269e0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
269f0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
26a00 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
26a10 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
26a20 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
26a30 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
26a40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
26a50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
26a60 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
26a70 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
26a80 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
26a90 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
26aa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
26ab0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
26ac0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
26ad0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
26ae0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
26af0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
26b00 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
26b10 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
26b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
26b30 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
26b40 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
26b50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
26b60 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
26b70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26b80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26b90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
26ba0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
26bb0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
26be0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
26bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26c00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
26c10 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
26c20 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
26c30 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
26c40 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
26c50 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
26c60 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
26c70 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
26c80 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
26c90 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
26ca0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
26cb0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26cc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26cd0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
26ce0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
26cf0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
26d00 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
26d10 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
26d20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
26d30 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
26d40 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
26d50 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
26d60 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26d70 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
26d80 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
26d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26da0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
26db0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
26dc0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
26dd0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
26e00 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
26e10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
26e20 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
26e30 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
26e40 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
26e50 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
26e60 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
26e70 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
26e80 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
26e90 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
26ea0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
26eb0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
26ec0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26ed0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26ee0 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
26ef0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
26f00 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
26f10 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
26f20 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
26f30 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
26f40 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
26f50 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
26f60 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
26f70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
26f80 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
26f90 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
26fa0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
26fb0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
26fc0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
26fd0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
26fe0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
26ff0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
27000 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27010 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
27020 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
27030 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
27040 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
27050 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
27060 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
27070 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
27080 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
27090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
270a0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
270b0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
270c0 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43  egAgg, SQLITE_EC
270d0 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
270e0 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
270f0 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
27100 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
27110 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
27120 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
27130 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
27140 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27160 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
27170 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
27180 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
27190 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
271a0 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
271b0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
271c0 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
271d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
271e0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f  COLL ){.      Co
271f0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
27200 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
27210 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
27220 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
27230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27240 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
27250 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
27260 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f  pFunc has NEEDCO
27270 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  LL */.      for(
27280 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
27290 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
272a0 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
272b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
272c0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
272d0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
272e0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
272f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27300 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
27310 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
27320 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
27330 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
27340 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
27350 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
27360 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69  umulator ) regHi
27370 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
27380 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
27390 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
273a0 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69  P_CollSeq, regHi
273b0 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  t, 0, 0, (char *
273c0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
273d0 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
273e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
273f0 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
27400 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
27410 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
27420 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
27430 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
27440 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
27450 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27460 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
27470 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27480 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
27490 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
274a0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
274b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
274c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
274d0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
274e0 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
274f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27500 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27510 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
27520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27530 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
27540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27550 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
27560 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
27570 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
27580 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
27590 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
275a0 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
275b0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
275c0 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
275d0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
275e0 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
275f0 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
27600 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
27610 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
27620 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
27630 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
27640 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
27650 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
27660 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
27670 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
27680 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
27690 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
276a0 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
276b0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
276c0 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
276d0 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
276e0 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
276f0 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
27700 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
27710 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
27720 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
27730 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
27740 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
27750 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
27760 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
27770 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
27780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
27790 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
277a0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
277b0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
277c0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
277d0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
277e0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
277f0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
27800 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
27810 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
27820 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27830 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
27840 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
27850 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
27860 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
27870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
27880 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
27890 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
278a0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
278b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
278c0 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
278d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
278e0 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
278f0 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
27900 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
27910 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
27920 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
27930 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
27940 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
27950 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
27960 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
27970 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
27980 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
27990 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279b0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
279c0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
279d0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
279e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
279f0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
27a00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
27a30 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
27a40 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
27a50 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
27a60 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
27a70 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
27a80 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
27a90 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
27aa0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
27ab0 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68  (pIdx)));.    ch
27ac0 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
27ad0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
27ae0 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
27af0 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
27b00 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
27b10 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
27b20 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
27b30 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
27b40 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
27b50 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
27b60 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
27b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
27b80 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
27b90 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
27ba0 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
27bb0 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
27bc0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
27bd0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
27be0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
27bf0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
27c00 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
27c10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
27c20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
27c30 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
27c40 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
27c50 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
27c60 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
27c70 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
27c80 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
27c90 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
27ca0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
27cb0 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
27cc0 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
27cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27ce0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
27cf0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
27d00 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
27d10 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
27d20 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
27d30 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
27d40 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
27d50 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
27d60 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
27d70 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
27d80 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
27d90 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
27da0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
27db0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
27dc0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
27dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27de0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
27df0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
27e00 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
27e10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
27e20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
27e30 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
27e40 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
27e50 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
27e60 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
27e70 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
27e80 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
27e90 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
27ea0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
27eb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
27ec0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
27ed0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
27ee0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
27ef0 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
27f00 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
27f10 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
27f20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
27f30 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
27f40 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
27f50 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
27f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27f70 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
27f80 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
27f90 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
27fa0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
27fb0 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
27fc0 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
27fd0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
27fe0 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
27ff0 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
28000 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
28010 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
28020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
28030 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
28040 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
28050 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
28060 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
28070 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
28080 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
28090 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
280a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
280b0 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
280c0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
280d0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
280e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
280f0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
28100 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
28110 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
28120 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
28130 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
28140 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
28150 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
28160 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
28170 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
28180 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
28190 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
281a0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
281b0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
281c0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
281d0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
281e0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
281f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
28200 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
28210 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
28220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
28230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28240 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
28250 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
28260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
28270 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
28280 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
28290 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
282a0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
282b0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
282c0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
282d0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
282e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
282f0 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
28300 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
28310 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
28320 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
28330 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
28340 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
28350 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
28360 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
28370 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
28380 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
28390 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61  sAggInfo));..  a
283a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
283b0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
283c0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
283d0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
283e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
283f0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
28400 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
28410 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
28420 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
28430 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
28440 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
28450 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28460 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28470 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
28480 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
28490 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
284a0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
284b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
284c0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
284d0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
284e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
284f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28500 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
28510 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
28520 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
28530 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
28540 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
28550 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28560 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
28570 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
28580 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
28590 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
285a0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
285b0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
285c0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
285d0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
285e0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
285f0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
28600 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
28610 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
28620 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
28630 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28640 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
28650 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
28660 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
28670 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
28680 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
28690 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
286a0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
286b0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
286c0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
286d0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
286e0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
286f0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
28700 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
28710 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
28720 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
28730 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
28740 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
28750 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
28760 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
28770 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
28780 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
28790 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
287a0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
287b0 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
287c0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
287d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
287e0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
287f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
28800 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
28810 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
28820 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
28830 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
28840 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
28850 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
28860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28870 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
28880 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
28890 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
288a0 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
288b0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
288c0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
288d0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
288e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
288f0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
28900 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
28910 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
28920 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28930 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
28940 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
28950 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
28960 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
28970 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
28980 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
28990 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
289a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
289b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
289c0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
289d0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
289e0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
289f0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
28a00 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
28a10 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
28a20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
28a30 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
28a40 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
28a50 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
28a60 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
28a70 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
28a80 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
28a90 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
28aa0 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
28ab0 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
28ac0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
28ad0 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
28ae0 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
28af0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
28b00 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
28b10 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
28b20 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
28b30 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
28b40 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
28b50 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
28b60 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
28b70 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
28b80 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
28b90 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
28ba0 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
28bb0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
28bc0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
28bd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
28be0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
28bf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28c00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28c10 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
28c20 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
28c30 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28c40 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
28c50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28c60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
28c70 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
28c80 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
28c90 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
28ca0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
28cb0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
28cc0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
28cd0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
28ce0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
28cf0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
28d00 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
28d10 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
28d20 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
28d30 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
28d40 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
28d50 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
28d60 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
28d70 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
28d80 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
28d90 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
28da0 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
28db0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
28dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
28dd0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
28de0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
28df0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
28e00 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
28e10 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
28e20 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
28e30 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
28e40 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
28e50 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
28e60 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
28e70 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
28e80 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
28e90 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
28ea0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
28eb0 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
28ec0 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
28ed0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
28ee0 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
28ef0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
28f00 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
28f10 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
28f20 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
28f30 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
28f40 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
28f50 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
28f60 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
28f70 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
28f80 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
28f90 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
28fa0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
28fb0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
28fc0 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
28fd0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
28fe0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
28ff0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
29000 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
29010 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
29020 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
29030 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
29040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29050 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
29060 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
29070 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
29080 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
29090 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
290a0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
290b0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
290c0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
290d0 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
290e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
290f0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
29100 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
29110 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29120 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
29130 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
29140 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
29150 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
29160 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
29170 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
29180 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
29190 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
291a0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
291b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
291c0 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
291d0 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  w);.      pItem-
291e0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  >viaCoroutine = 
291f0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
29200 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
29210 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
29220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29230 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
29240 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
29250 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
29260 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
29270 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
29280 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
29290 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
292a0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
292b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
292c0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
292d0 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
292e0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
292f0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
29300 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
29310 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
29320 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
29330 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
29340 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
29350 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
29360 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
29370 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
29380 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
29390 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
293a0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
293b0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
293c0 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
293d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
293e0 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
293f0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
29400 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
29410 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
29420 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
29430 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
29440 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
29450 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
29460 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
29470 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
29480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
29490 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
294a0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
294b0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
294c0 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
294d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
294e0 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  ->isCorrelated==
294f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
29500 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
29510 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
29520 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
29530 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
29540 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
29550 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
29560 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
29570 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
29580 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
29590 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
295a0 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
295b0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
295c0 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
295d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
295e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
295f0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
29600 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
29610 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29630 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
29640 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
29650 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
29660 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
29670 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
29680 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29690 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
296a0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
296b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
296c0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
296d0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
296e0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
296f0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
29700 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
29710 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
29720 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
29730 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
29740 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
29750 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
29760 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
29770 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
29780 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
29790 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
297a0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
297b0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
297c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
297d0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
297e0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
297f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
29800 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
29810 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
29820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29830 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
29840 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
29850 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
29860 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
29870 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
29880 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e    if( /*pParse->
29890 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61  nErr ||*/ db->ma
298a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
298b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
298c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
298d0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
298e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
298f0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
29900 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
29910 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49  pSrc;.    if( !I
29920 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
29930 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
29940 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
29950 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
29960 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
29970 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
29980 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
29990 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
299a0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
299b0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
299c0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
299d0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
299e0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
299f0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
29a00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29a10 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
29a20 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
29a30 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
29a40 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
29a50 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
29a60 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
29a70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
29a80 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
29a90 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
29aa0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
29ab0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
29ac0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
29ad0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
29ae0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65  electId);.    re
29af0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
29b00 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
29b10 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
29b20 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
29b30 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61   BY but is not a
29b40 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64  n aggregate, and
29b50 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65   .  ** if the se
29b60 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65  lect-list is the
29b70 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44   same as the ORD
29b80 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e  ER BY list, then
29b90 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a   this query.  **
29ba0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
29bb0 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e  n as a GROUP BY.
29bc0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
29bd0 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
29be0 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54       SELECT DIST
29bf0 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  INCT xyz FROM ..
29c00 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  . ORDER BY xyz. 
29c10 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e   **.  ** is tran
29c20 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a  sformed to:.  **
29c30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
29c40 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52   xyz FROM ... GR
29c50 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  OUP BY xyz.  **.
29c60 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
29c70 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
29c80 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
29c90 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
29ca0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
29cb0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
29cc0 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
29cd0 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
29ce0 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
29cf0 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
29d00 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
29d10 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
29d20 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
29d30 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
29d40 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
29d50 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
29d60 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
29d70 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
29d80 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
29d90 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
29da0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
29db0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
29dc0 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
29dd0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
29de0 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
29df0 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c  pOrderBy, p->pEL
29e00 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
29e10 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
29e20 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
29e30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
29e40 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
29e50 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
29e60 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
29e70 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
29e80 75 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e  upBy;.    sSort.
29e90 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
29ea0 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
29eb0 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
29ec0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
29ed0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
29ee0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
29ef0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
29f00 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
29f10 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
29f20 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
29f30 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
29f40 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
29f50 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
29f60 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
29f70 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
29f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
29f90 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
29fa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29fb0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
29fc0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
29fd0 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
29fe0 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
29ff0 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
2a000 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
2a010 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
2a020 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
2a030 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
2a040 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
2a050 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
2a060 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
2a070 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
2a080 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
2a090 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
2a0a0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
2a0b0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
2a0c0 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
2a0d0 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
2a0e0 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
2a0f0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2a100 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
2a110 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
2a120 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
2a130 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
2a140 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
2a150 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
2a160 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a170 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e  t(pParse, sSort.
2a180 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
2a190 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
2a1a0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
2a1b0 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
2a1c0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
2a1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a1e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2a1f0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2a200 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
2a210 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
2a220 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
2a230 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
2a240 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
2a250 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2a260 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
2a270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
2a280 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2a290 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
2a2a0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
2a2b0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
2a2c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2a2d0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
2a2e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
2a2f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a300 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
2a310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a320 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
2a330 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
2a340 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
2a350 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
2a360 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
2a370 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
2a380 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a390 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53  abel(v);.  p->nS
2a3a0 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45  electRow = LARGE
2a3b0 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70  ST_INT64;.  comp
2a3c0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
2a3d0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
2a3e0 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
2a3f0 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e  mit==0 && sSort.
2a400 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2a410 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2a420 64 62 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72  dbeGetOp(v, sSor
2a430 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2a440 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f  ->opcode = OP_So
2a450 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53  rterOpen;.    sS
2a460 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
2a470 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
2a480 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
2a490 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
2a4a0 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2a4b0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
2a4c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
2a4d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2a4e0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
2a4f0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
2a500 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2a510 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
2a520 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
2a530 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2a540 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2a550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2a580 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2a5b0 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  )keyInfoFromExpr
2a5c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
2a5d0 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
2a600 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
2a610 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2a620 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
2a630 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
2a640 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2a650 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2a660 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
2a670 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
2a680 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2a690 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
2a6a0 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
2a6b0 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
2a6c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
2a6d0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2a6e0 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
2a6f0 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
2a700 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
2a710 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
2a720 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
2a730 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
2a740 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
2a750 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2a760 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
2a770 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2a780 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2a790 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
2a7a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2a7d0 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
2a7e0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
2a7f0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2a800 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a810 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2a820 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2a830 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
2a840 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
2a850 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2a860 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
2a870 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2a880 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2a890 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
2a8a0 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
2a8b0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
2a8c0 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
2a8d0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2a8e0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
2a8f0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2a900 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2a910 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2a920 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
2a930 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
2a940 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2a950 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2a960 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
2a970 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
2a980 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2a990 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2a9a0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
2a9b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2a9c0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
2a9d0 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
2a9e0 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
2a9f0 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
2aa00 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
2aa10 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
2aa20 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
2aa30 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
2aa40 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
2aa50 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
2aa60 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
2aa70 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
2aa80 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
2aa90 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
2aaa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2aab0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2aac0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2aad0 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
2aae0 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
2aaf0 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
2ab00 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
2ab10 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
2ab20 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c  , p, pEList, -1,
2ab30 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
2ab40 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
2ab70 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
2ab80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2ab90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2aba0 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2abb0 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
2abc0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
2abd0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
2abe0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
2abf0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2ac00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2ac10 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
2ac20 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
2ac30 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
2ac40 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2ac50 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
2ac60 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
2ac70 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
2ac80 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2ac90 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
2aca0 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2acb0 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
2acc0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2acd0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2ace0 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
2acf0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2ad00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
2ad10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2ad20 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2ad30 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
2ad40 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2ad50 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
2ad60 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2ad70 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
2ad80 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
2ad90 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2adb0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
2adc0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
2add0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
2ade0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2adf0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
2ae00 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
2ae10 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
2ae20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2ae30 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
2ae40 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
2ae50 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
2ae60 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
2ae70 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
2ae80 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
2ae90 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
2aea0 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
2aeb0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2aec0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
2aed0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
2aee0 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
2aef0 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
2af00 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
2af10 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
2af20 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
2af30 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
2af40 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
2af50 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
2af60 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
2af70 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
2af80 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
2af90 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
2afa0 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
2afb0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
2afc0 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
2afd0 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
2afe0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2aff0 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
2b000 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2b010 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2b020 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
2b030 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
2b040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2b050 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2b060 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2b070 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2b080 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2b090 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
2b0a0 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
2b0b0 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
2b0c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
2b0d0 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
2b0e0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
2b0f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
2b100 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
2b110 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2b120 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
2b130 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2b140 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
2b150 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2b160 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2b170 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2b180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b190 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31   p->nSelectRow>1
2b1a0 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  00 ) p->nSelectR
2b1b0 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65  ow = 100;.    }e
2b1c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  lse{.      p->nS
2b1d0 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20  electRow = 1;.  
2b1e0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20    }...    /* If 
2b1f0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
2b200 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
2b210 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2b220 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20  and they are.   
2b230 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
2b240 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f  hen it may be po
2b250 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c  ssible to disabl
2b260 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2b270 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e  lause .    ** on
2b280 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61   the grounds tha
2b290 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77  t the GROUP BY w
2b2a0 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
2b2b0 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a  ts to come out .
2b2c0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f      ** in the co
2b2d0 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20  rrect order. It 
2b2e0 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74  also may not - t
2b2f0 68 65 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20  he GROUP BY may 
2b300 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74  use a.    ** dat
2b310 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74  abase index that
2b320 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20   causes rows to 
2b330 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  be grouped toget
2b340 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a  her as required.
2b350 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61      ** but not a
2b360 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20  ctually sorted. 
2b370 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f  Either way, reco
2b380 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
2b390 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45   the.    ** ORDE
2b3a0 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
2b3b0 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68  Y clauses are th
2b3c0 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e  e same by settin
2b3d0 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70  g the orderByGrp
2b3e0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
2b3f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
2b400 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2b410 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73  pare(pGroupBy, s
2b420 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d  Sort.pOrderBy, -
2b430 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  1)==0 ){.      o
2b440 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20  rderByGrp = 1;. 
2b450 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72     }. .    /* Cr
2b460 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
2b470 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
2b480 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
2b490 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
2b4a0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
2b4b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2b4c0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
2b4d0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
2b4e0 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
2b4f0 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
2b500 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
2b510 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
2b520 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
2b530 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
2b540 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
2b550 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
2b560 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
2b570 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
2b580 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
2b590 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
2b5a0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
2b5b0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
2b5c0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
2b5d0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
2b5e0 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
2b5f0 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
2b600 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
2b610 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2b620 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
2b630 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2b640 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
2b650 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
2b660 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
2b670 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b680 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
2b690 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
2b6a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b6b0 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
2b6c0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
2b6d0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
2b6e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2b6f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2b700 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
2b710 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2b720 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
2b730 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
2b740 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
2b750 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
2b760 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
2b770 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2b780 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
2b790 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
2b7a0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2b7b0 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2b7c0 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
2b7d0 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
2b7e0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b7f0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
2b800 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2b810 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2b820 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2b830 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
2b840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2b850 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
2b860 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
2b870 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b880 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2b890 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
2b8a0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
2b8b0 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
2b8c0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
2b8d0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
2b8e0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
2b8f0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
2b900 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
2b910 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
2b920 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2b930 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
2b940 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
2b950 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
2b960 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
2b970 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
2b980 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20        int j1;   
2b990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
2b9a0 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
2b9b0 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
2b9c0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
2b9d0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
2b9e0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2b9f0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
2ba00 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
2ba10 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
2ba20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2ba30 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
2ba40 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2ba50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2ba60 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
2ba70 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
2ba80 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
2ba90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2baa0 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
2bab0 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
2bac0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
2bad0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
2bae0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
2baf0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
2bb00 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2bb10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2bb20 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
2bb30 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
2bb40 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
2bb50 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
2bb60 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
2bb70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bb80 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2bb90 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
2bba0 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
2bbb0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2bbc0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2bbd0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
2bbe0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2bbf0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
2bc00 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
2bc10 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
2bc20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
2bc30 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
2bc40 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2bc50 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
2bc60 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
2bc70 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
2bc80 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
2bc90 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
2bca0 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
2bcb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
2bcc0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2bcd0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
2bce0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
2bcf0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2bd00 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2bd10 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29   pGroupBy, 0, 0)
2bd20 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2bd30 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2bd40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2bd50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2bd60 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2bd70 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2bd80 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2bd90 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2bda0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2bdb0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2bdc0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2bdd0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2bde0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2bdf0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2be00 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2be10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2be20 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2be30 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2be40 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2be50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2be60 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2be70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2be80 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2be90 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2bea0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2beb0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2bec0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2bed0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2bee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2bef0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2bf00 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2bf10 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2bf20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2bf30 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2bf40 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2bf50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2bf60 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2bf70 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2bf80 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2bf90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2bfa0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2bfb0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2bfc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bfd0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2bfe0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2bff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c000 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2c010 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2c020 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2c030 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2c040 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2c050 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2c060 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2c070 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2c080 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2c090 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2c0a0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2c0b0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2c0c0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2c0d0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2c0e0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2c0f0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2c100 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2c110 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2c120 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2c130 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2c140 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2c150 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2c160 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2c170 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2c180 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2c190 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2c1a0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2c1b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c1c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c1d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2c1e0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2c1f0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2c200 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2c210 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2c220 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2c230 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2c240 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2c250 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2c260 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2c270 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2c280 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2c290 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2c2a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2c2b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2c2c0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2c2d0 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2c2e0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2c2f0 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2c300 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2c310 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2c320 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2c330 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2c340 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2c350 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2c360 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2c370 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2c380 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2c390 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2c3a0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2c3b0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2c3c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c3d0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2c3e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2c3f0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2c400 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2c410 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2c420 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2c430 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2c440 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2c450 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2c460 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2c470 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2c480 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2c490 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2c4a0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2c4b0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2c4c0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2c4d0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2c4e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2c4f0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2c500 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2c510 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2c520 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2c530 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2c540 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2c550 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2c560 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2c570 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2c580 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2c590 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5b0 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2c5c0 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2c5d0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2c5e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2c5f0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2c600 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2c610 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2c620 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
2c630 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2c640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2c650 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2c660 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2c670 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2c680 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2c690 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2c6a0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2c6b0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2c6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c6d0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2c6e0 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2c6f0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2c700 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2c710 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2c720 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2c730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c740 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2c750 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2c760 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2c770 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2c780 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2c790 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2c7a0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2c7b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2c7c0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2c7d0 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2c7e0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2c7f0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2c800 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2c810 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2c820 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2c830 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2c840 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2c850 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2c860 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2c870 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2c8a0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2c8b0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2c8c0 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2c8d0 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2c8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c8f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c900 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2c910 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2c920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c930 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2c940 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c950 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2c960 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2c970 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2c980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c990 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2c9a0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2c9b0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2c9c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c9d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c9e0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2c9f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2ca00 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2ca10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ca20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2ca30 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2ca40 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2ca50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2ca60 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2ca70 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2ca80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2ca90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2caa0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2cab0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2cac0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2cad0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2cae0 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2caf0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2cb00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2cb10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2cb20 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2cb30 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2cb40 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2cb50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cb60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2cb70 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2cb80 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2cb90 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2cba0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2cbb0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2cbc0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2cbd0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2cbe0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2cbf0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2cc00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2cc10 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2cc20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2cc30 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2cc40 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2cc50 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2cc60 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2cc70 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2cc80 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2cc90 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2cca0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2ccb0 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2ccc0 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2ccd0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2cce0 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2ccf0 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2cd00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2cd10 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2cd20 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2cd30 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2cd40 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2cd50 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2cd60 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2cd70 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2cd80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2cd90 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2cda0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2cdb0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2cdc0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2cdd0 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2cde0 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2cdf0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2ce00 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2ce10 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2ce20 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2ce30 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2ce40 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2ce50 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2ce60 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2ce70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2ce80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ce90 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2cea0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ceb0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2cec0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2ced0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2cee0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2cef0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2cf00 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2cf10 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2cf20 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2cf30 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2cf40 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2cf50 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2cf60 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2cf70 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2cf80 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2cf90 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2cfa0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2cfb0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2cfc0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2cfd0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2cfe0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2cff0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2d000 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2d010 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2d020 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2d030 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2d040 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2d050 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d070 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2d080 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2d090 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20  x, sortOut);.   
2d0a0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2d0b0 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
2d0c0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2d0d0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2d0e0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2d0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d100 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2d110 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
2d120 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2d130 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71     if( j==0 ) sq
2d140 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2d150 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
2d160 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
2d170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d180 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
2d190 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
2d1a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d1b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
2d1c0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
2d1d0 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
2d1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d1f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
2d210 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
2d220 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2d230 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d250 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
2d260 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
2d270 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
2d280 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
2d290 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2d2a0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2d2b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2d2c0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
2d2d0 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f  0, j1+1); VdbeCo
2d2e0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
2d2f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2d300 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
2d310 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
2d320 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
2d330 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
2d340 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
2d350 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2d360 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
2d370 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
2d380 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
2d390 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
2d3a0 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
2d3b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2d3c0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
2d3d0 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
2d3e0 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
2d3f0 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
2d400 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
2d410 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
2d420 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
2d430 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2d440 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
2d450 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2d460 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2d470 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
2d480 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
2d490 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
2d4a0 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
2d4b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d4c0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
2d4d0 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
2d4e0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2d4f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d500 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d510 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2d520 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2d530 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2d540 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2d550 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
2d560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2d580 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
2d590 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43   addrEnd); VdbeC
2d5a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2d5b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d5c0 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
2d5d0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2d5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d5f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2d600 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2d610 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2d620 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
2d630 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2d640 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2d650 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2d660 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
2d670 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
2d680 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2d690 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
2d6a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d6b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2d6c0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
2d6d0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2d6e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2d6f0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2d700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d710 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
2d720 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2d730 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d740 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
2d750 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2d760 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
2d770 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
2d780 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
2d790 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2d7a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d7b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2d7c0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
2d7d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2d7e0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
2d7f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2d800 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
2d810 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2d820 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2d830 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
2d840 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2d850 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
2d860 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
2d870 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
2d880 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
2d890 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
2d8a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2d8b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d8c0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2d8d0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2d8e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2d8f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2d900 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
2d910 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
2d920 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
2d930 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
2d940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d950 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2d960 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
2d970 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2d980 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2d990 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
2d9a0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2d9b0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2d9c0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
2d9d0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
2d9e0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
2d9f0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
2da00 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
2da10 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2da20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
2da30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2da40 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
2da50 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
2da60 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
2da70 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
2da80 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
2da90 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
2daa0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
2dab0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2dac0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2dad0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
2dae0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
2daf0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
2db00 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2db10 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
2db20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2db30 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2db40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2db50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2db60 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
2db70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2db80 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
2db90 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2dba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dbb0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2dbc0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2dbd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2dbe0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2dbf0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
2dc00 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
2dc10 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2dc20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2dc30 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2dc40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2dc50 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
2dc60 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2dc70 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
2dc80 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2dc90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
2dca0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2dcb0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
2dcc0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
2dcd0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2dce0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2dcf0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2dd00 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2dd10 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
2dd20 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2dd30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2dd40 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2dd50 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
2dd60 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
2dd70 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2dd80 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2dd90 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2dda0 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ddc0 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
2ddd0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
2de00 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
2de10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2de20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2de30 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2de40 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2de50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2de60 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
2de70 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
2de80 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2de90 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2dea0 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
2deb0 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
2dec0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
2ded0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2dee0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2def0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2df00 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
2df10 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2df20 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2df30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2df40 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2df50 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
2df60 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
2df70 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
2df80 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2df90 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
2dfa0 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
2dfb0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2dfc0 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
2dfd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
2dfe0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
2dff0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2e000 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
2e010 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
2e020 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
2e030 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
2e040 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
2e050 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2e060 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
2e070 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
2e080 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
2e090 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
2e0a0 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
2e0b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2e0c0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2e0d0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
2e0e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e0f0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
2e100 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
2e110 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
2e120 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
2e130 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e140 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
2e150 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
2e160 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
2e170 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
2e180 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
2e190 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
2e1a0 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
2e1b0 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
2e1c0 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
2e1d0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2e1e0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
2e1f0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
2e200 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
2e210 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
2e220 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
2e230 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
2e240 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
2e250 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
2e260 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
2e270 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
2e280 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
2e290 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
2e2a0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
2e2b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e2c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
2e2d0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2e2e0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2e2f0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2e300 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2e310 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
2e320 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
2e330 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
2e340 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
2e350 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2e380 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2e390 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2e3a0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e3c0 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
2e3d0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
2e3e0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
2e3f0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2e400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
2e410 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
2e420 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2e430 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
2e440 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
2e450 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
2e460 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
2e470 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
2e480 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2e490 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2e4a0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2e4b0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
2e4c0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
2e4d0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
2e4e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
2e4f0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2e500 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2e510 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
2e520 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
2e530 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e540 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
2e550 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
2e560 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
2e570 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
2e580 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e590 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
2e5a0 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
2e5b0 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
2e5c0 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
2e5d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e5e0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
2e5f0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2e600 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
2e610 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
2e620 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
2e630 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
2e640 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
2e650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e660 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2e670 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
2e680 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2e690 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2e6a0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
2e6b0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
2e6c0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2e6d0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
2e6e0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
2e6f0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
2e700 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
2e710 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
2e720 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
2e730 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
2e740 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
2e750 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
2e760 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
2e770 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
2e780 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2e790 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
2e7a0 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
2e7b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e7c0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
2e7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
2e7e0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
2e7f0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
2e800 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2e810 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
2e820 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
2e830 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2e840 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
2e850 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
2e860 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
2e870 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
2e880 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
2e890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2e8a0 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
2e8b0 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
2e8c0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
2e8d0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
2e8e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e8f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2e900 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
2e910 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2e920 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
2e930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
2e950 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
2e960 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
2e970 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
2e980 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2e990 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
2e9a0 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
2e9b0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
2e9c0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
2e9d0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
2e9e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e9f0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2ea00 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
2ea10 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
2ea20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
2ea30 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2ea40 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
2ea50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2ea60 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
2ea70 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
2ea80 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2ea90 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
2eaa0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2eab0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2eac0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
2ead0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
2eae0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
2eaf0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
2eb00 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
2eb10 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
2eb20 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
2eb30 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
2eb40 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
2eb50 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
2eb60 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
2eb70 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
2eb80 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
2eb90 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
2eba0 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
2ebb0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
2ebc0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
2ebd0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
2ebe0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
2ebf0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
2ec00 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2ec10 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
2ec20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
2ec30 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
2ec40 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
2ec50 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
2ec60 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
2ec70 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
2ec80 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
2ec90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2eca0 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
2ecb0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
2ecc0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
2ecd0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
2ece0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
2ecf0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
2ed00 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
2ed10 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ed20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
2ed30 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
2ed40 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
2ed50 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
2ed60 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
2ed70 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
2ed80 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
2ed90 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
2eda0 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
2edb0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
2edc0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
2edd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
2ede0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
2edf0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
2ee00 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
2ee10 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
2ee20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
2ee30 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
2ee40 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
2ee50 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
2ee60 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
2ee70 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
2ee80 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
2ee90 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
2eea0 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
2eeb0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
2eec0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
2eed0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
2eee0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
2eef0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
2ef00 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
2ef10 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
2ef20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
2ef30 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
2ef40 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
2ef50 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
2ef60 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
2ef70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
2ef80 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
2ef90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2efa0 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
2efb0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
2efc0 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
2efd0 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
2efe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eff0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
2f000 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
2f010 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
2f020 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
2f030 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
2f040 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2f050 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
2f060 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
2f070 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
2f080 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
2f090 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f0a0 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
2f0b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
2f0d0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
2f0e0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
2f0f0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
2f100 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
2f110 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
2f120 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
2f130 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
2f140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
2f150 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
2f160 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
2f170 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
2f180 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2f190 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
2f1a0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
2f1b0 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
2f1c0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
2f1d0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
2f1e0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
2f1f0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
2f200 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2f210 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2f220 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2f230 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2f240 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2f250 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2f260 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
2f270 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
2f280 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
2f290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2f2a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2f2b0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2f2c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
2f2d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
2f2e0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
2f2f0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2f300 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2f310 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f320 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
2f330 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
2f340 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
2f350 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2f360 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30  rdered(pWInfo)>0
2f370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2f380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f390 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
2f3a0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2f3b0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2f3c0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2f3d0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
2f3e0 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
2f3f0 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
2f400 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
2f410 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
2f420 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2f430 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2f440 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2f450 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
2f460 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
2f470 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2f480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
2f490 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2f4a0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2f4b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2f4c0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
2f4d0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
2f4e0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
2f4f0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
2f500 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
2f510 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
2f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f530 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
2f540 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
2f550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f560 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2f570 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
2f580 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2f590 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2f5a0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
2f5b0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
2f5c0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
2f5d0 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
2f5e0 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
2f5f0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2f600 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
2f610 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
2f620 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
2f630 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
2f640 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
2f650 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
2f660 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
2f670 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
2f680 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
2f690 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
2f6a0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
2f6b0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2f6c0 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
2f6d0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2f6e0 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30  , sSort.nOBSat>0
2f6f0 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
2f700 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
2f710 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
2f720 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
2f730 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c  arse, p, &sSort,
2f740 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
2f750 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
2f760 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
2f770 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
2f780 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2f790 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2f7a0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
2f7b0 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
2f7c0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
2f7d0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
2f7e0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
2f7f0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
2f800 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
2f810 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
2f820 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
2f830 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
2f840 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
2f850 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
2f860 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
2f870 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
2f880 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
2f890 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
2f8a0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
2f8b0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
2f8c0 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
2f8d0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
2f8e0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
2f8f0 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
2f900 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
2f910 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
2f920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f930 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f940 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
2f950 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
2f960 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
2f970 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
2f980 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
2f990 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
2f9a0 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
2f9b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
2f9c0 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
2f9d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2f9e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f9f0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
2fa00 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
2fa10 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
2fa20 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f  dable descriptio
2fa30 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63  n of a the Selec
2fa40 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
2fa50 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
2fa60 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a  OneSelect(Vdbe *
2fa70 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
2fa80 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ){.  sqlite3Expl
2fa90 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2faa0 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69   "SELECT ");.  i
2fab0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2fac0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2fad0 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
2fae0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
2faf0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2fb00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2fb10 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fb20 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20  Vdbe, "DISTINCT 
2fb30 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
2fb40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2fb50 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
2fb60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fb70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fb80 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a  , "agg_flag ");.
2fb90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2fba0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2fbb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fbc0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fbd0 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20  e, "   ");.  }. 
2fbe0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2fbf0 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
2fc00 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
2fc10 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2fc20 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  dbe);.  if( p->p
2fc30 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
2fc40 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  nSrc ){.    int 
2fc50 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  i;.    sqlite3Ex
2fc60 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fc70 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20  e, "FROM ");.   
2fc80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fc90 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20  ush(pVdbe);.    
2fca0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
2fcb0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
2fcc0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2fcd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2fce0 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
2fcf0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
2fd00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fd10 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22  dbe, "{%d,*} = "
2fd20 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2fd30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
2fd40 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
2fd50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2fd60 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62  plainSelect(pVdb
2fd70 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2fd80 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
2fd90 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
2fda0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fdb0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fdc0 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d  dbe, " (tabname=
2fdd0 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
2fde0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2fdf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2fe00 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
2fe10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2fe20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fe30 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70  f(pVdbe, "%s", p
2fe40 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
2fe50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fe60 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
2fe70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fe80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fe90 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c  dbe, " (AS %s)",
2fea0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
2feb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fec0 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
2fed0 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
2fee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fef0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2ff00 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22  be, " LEFT-JOIN"
2ff10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ff20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2ff30 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a  L(pVdbe);.    }.
2ff40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ff50 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20  inPop(pVdbe);.  
2ff60 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
2ff70 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
2ff80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2ff90 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a  dbe, "WHERE ");.
2ffa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ffb0 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2ffc0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
2ffd0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2ffe0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2fff0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
30000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30010 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
30020 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20  "GROUPBY ");.   
30030 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
30040 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
30050 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
30060 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
30070 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
30080 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
30090 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
300a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
300b0 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20  , "HAVING ");.  
300c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
300d0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
300e0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
300f0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
30100 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
30110 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
30120 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30130 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
30140 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20  ORDERBY ");.    
30150 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
30160 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
30170 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
30180 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
30190 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
301a0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
301b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
301c0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
301d0 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73  "LIMIT ");.    s
301e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
301f0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d  r(pVdbe, p->pLim
30200 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
30210 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
30220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
30230 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71  Offset ){.    sq
30240 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
30250 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45  tf(pVdbe, "OFFSE
30260 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
30270 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
30280 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  be, p->pOffset);
30290 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
302a0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
302b0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
302c0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64  ExplainSelect(Vd
302d0 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63  be *pVdbe, Selec
302e0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
302f0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30300 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
30310 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65  dbe, "(null-sele
30320 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ct)");.    retur
30330 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
30340 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
30350 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e);.  while( p )
30360 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  {.    explainOne
30370 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29  Select(pVdbe, p)
30380 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
30390 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  xt;.    if( p==0
303a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
303b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
303c0 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Vdbe);.    sqlit
303d0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
303e0 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73  pVdbe, "%s\n", s
303f0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
30400 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p));.  }.  sqlit
30410 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
30420 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20  pVdbe, "END");. 
30430 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30440 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a  op(pVdbe);.}../*
30450 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
30460 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
30470 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
30480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
304d0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
304e0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
304f0 50 4c 41 49 4e 29 20 2a 2f 0a                    PLAIN) */.