/ Hex Artifact Content
Login

Artifact da24f2e57a704dd8e0ce96df18e7442145582c65b4eb1c3176367e530d665928:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  *.*/.#include "s
0170: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 76 6f 69  qliteInt.h"..voi
0180: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  d sqlite3WindowD
0190: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
01a0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
01b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
01c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
01d0: 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b  db, p->pFilter);
01e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
01f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0200: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
0210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
0220: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0230: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
0240: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0250: 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20  (db, p->pEnd);. 
0260: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0270: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61  lete(db, p->pSta
0280: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
0290: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
02a0: 20 7d 0a 7d 0a 0a 57 69 6e 64 6f 77 20 2a 73 71   }.}..Window *sq
02b0: 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63  lite3WindowAlloc
02c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
02d0: 65 2c 20 0a 20 20 69 6e 74 20 65 54 79 70 65 2c  e, .  int eType,
02e0: 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 45 78 70  .  int eEnd, Exp
02f0: 72 20 2a 70 45 6e 64 2c 20 0a 20 20 69 6e 74 20  r *pEnd, .  int 
0300: 65 53 74 61 72 74 2c 20 45 78 70 72 20 2a 70 53  eStart, Expr *pS
0310: 74 61 72 74 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  tart.){.  Window
0320: 20 2a 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77   *pWin = (Window
0330: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
0340: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
0350: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
0360: 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 20 29  );..  if( pWin )
0370: 7b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70  {.    pWin->eTyp
0380: 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 70  e = eType;.    p
0390: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
03a0: 74 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  tart;.    pWin->
03b0: 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 20  eEnd = eEnd;.   
03c0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 45   pWin->pEnd = pE
03d0: 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53  nd;.    pWin->pS
03e0: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
03f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
0400: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
0410: 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b  arse->db, pEnd);
0420: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0430: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
0440: 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  b, pStart);.  }.
0450: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
0460: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  }..void sqlite3W
0470: 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73  indowAttach(Pars
0480: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0490: 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  *p, Window *pWin
04a0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
04b0: 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e    p->pWin = pWin
04c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
04d0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
04e0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
04f0: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
0500: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
0510: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
0520: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
0530: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
0540: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
0550: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  nt sqlite3Window
0560: 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70  Compare(Parse *p
0570: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
0580: 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a  1, Window *p2){.
0590: 20 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21    if( p1->eType!
05a0: 3d 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74  =p2->eType ) ret
05b0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
05c0: 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74  >eStart!=p2->eSt
05d0: 61 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  art ) return 1;.
05e0: 20 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d    if( p1->eEnd!=
05f0: 70 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72  p2->eEnd ) retur
0600: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
0610: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
0620: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
0630: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
0640: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
0650: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
0660: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
0670: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
0680: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
0690: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
06a0: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
06b0: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
06c0: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
06d0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
06e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
06f0: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
0700: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
0710: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
0720: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
0730: 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  n 0;.}..void sql
0740: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e  ite3WindowCodeIn
0750: 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  it(Parse *pParse
0760: 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b  , Window *pWin){
0770: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
0780: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0790: 73 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74  se);.  int nPart
07a0: 20 3d 20 28 70 57 69 6e 2d 3e 70 50 61 72 74 69   = (pWin->pParti
07b0: 74 69 6f 6e 20 3f 20 70 57 69 6e 2d 3e 70 50 61  tion ? pWin->pPa
07c0: 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a  rtition->nExpr :
07d0: 20 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20   0);.  nPart += 
07e0: 28 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20  (pWin->pOrderBy 
07f0: 3f 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  ? pWin->pOrderBy
0800: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
0810: 69 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20  if( nPart ){.   
0820: 20 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d   pWin->regPart =
0830: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
0840: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
0850: 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20  m += nPart;.    
0860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0870: 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
0880: 20 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20   pWin->regPart, 
0890: 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50  pWin->regPart+nP
08a0: 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  art-1);.  }.}../
08b0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
08c0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
08d0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
08e0: 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e  NT ROW.**.**   .
08f0: 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65  ...**     if( ne
0900: 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
0910: 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
0920: 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
0930: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
0940: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52  Gosub.**       R
0950: 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74  esetSorter eph-t
0960: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  able.**     }.**
0970: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 65       else if( ne
0980: 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
0990: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
09a0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  lue).**       Go
09b0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
09c0: 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74         ResetSort
09d0: 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20  er eph-table.** 
09e0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67      }.**     Agg
09f0: 53 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65  Step.**     Inse
0a00: 72 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f 20  rt (record into 
0a10: 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20  eph-table).**   
0a20: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
0a30: 29 0a 2a 2a 20 20 20 41 67 67 46 69 6e 61 6c 20  ).**   AggFinal 
0a40: 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
0a50: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
0a60: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
0a70: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
0a80: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42  RECEDING AND UNB
0a90: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
0aa0: 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  .**.**   As abov
0ab0: 65 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e  e, except take n
0ac0: 6f 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22  o action for a "
0ad0: 6e 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b  new peer". Invok
0ae0: 65 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72  e.**   the sub-r
0af0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79  outine once only
0b00: 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74   for each partit
0b10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ion..**.** RANGE
0b20: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
0b30: 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
0b40: 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20   ROW.**.**   As 
0b50: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
0b60: 61 74 20 74 68 65 20 22 6e 65 77 20 70 65 65 72  at the "new peer
0b70: 22 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68  " condition is h
0b80: 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a  andled in the.**
0b90: 20 20 20 73 61 6d 65 20 77 61 79 20 61 73 20 22     same way as "
0ba0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28  new partition" (
0bb0: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  so there is no "
0bc0: 65 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e  else if" block).
0bd0: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
0be0: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
0bf0: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
0c00: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
0c10: 20 4f 6e 65 20 77 61 79 20 69 73 20 74 6f 20 6a   One way is to j
0c20: 75 73 74 20 72 65 76 65 72 73 65 20 74 68 65 20  ust reverse the 
0c30: 73 6f 72 74 20 6f 72 64 65 72 20 61 6e 64 20 64  sort order and d
0c40: 6f 20 61 73 20 66 6f 72 20 42 45 54 57 45 45 4e  o as for BETWEEN
0c50: 20 0a 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44   .**   UNBOUNDED
0c60: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
0c70: 55 52 52 45 4e 54 20 52 4f 57 2e 20 42 75 74 20  URRENT ROW. But 
0c80: 74 68 61 74 20 69 73 20 6e 6f 74 20 71 75 69 74  that is not quit
0c90: 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 0a 2a  e the same for.*
0ca0: 2a 20 20 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  *   things like 
0cb0: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 2e 20  group_concat(). 
0cc0: 41 6e 64 20 70 65 72 68 61 70 73 20 6f 74 68 65  And perhaps othe
0cd0: 72 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 61  r user defined a
0ce0: 67 67 72 65 67 61 74 65 73 20 0a 2a 2a 20 20 20  ggregates .**   
0cf0: 61 73 20 77 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 20  as well..**.**  
0d00: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20   ....**     if( 
0d10: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b  new partition ){
0d20: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
0d30: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3b  flush_partition;
0d40: 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53  .**       ResetS
0d50: 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a  orter eph-table.
0d60: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
0d70: 41 67 67 53 74 65 70 0a 2a 2a 20 20 20 20 20 49  AggStep.**     I
0d80: 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e  nsert (record in
0d90: 74 6f 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a  to eph-table).**
0da0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
0db0: 6e 64 28 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20  nd().**   Gosub 
0dc0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a  flush_partition.
0dd0: 2a 2a 0a 2a 2a 20 20 66 6c 75 73 68 5f 70 61 72  **.**  flush_par
0de0: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 4f 70 65  tition:.**   Ope
0df0: 6e 44 75 70 20 28 63 73 72 20 2d 3e 20 63 73 72  nDup (csr -> csr
0e00: 32 29 0a 2a 2a 20 20 20 66 6f 72 65 61 63 68 20  2).**   foreach 
0e10: 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74  (record in eph-t
0e20: 61 62 6c 65 29 20 7b 0a 2a 2a 20 20 20 20 20 69  able) {.**     i
0e30: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
0e40: 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  *       while( c
0e50: 73 72 32 21 3d 63 73 72 20 29 7b 0a 2a 2a 20 20  sr2!=csr ){.**  
0e60: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
0e70: 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20  xInverse).**    
0e80: 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29       Next (csr2)
0e90: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
0ea0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46     }.**     AggF
0eb0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
0ec0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
0ed0: 6f 73 75 62 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  osub.**   }.**.*
0ee0: 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  *===============
0ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 0a 2a 2a 20  =========.**.** 
0f30: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
0f40: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
0f50: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
0f60: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
0f70: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
0f80: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
0f90: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
0fa0: 7a 65 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ze).**     }.** 
0fb0: 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
0fc0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
0fd0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75  lue).**     Gosu
0fe0: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
0ff0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1000: 28 29 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  ().**.** ROWS BE
1010: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
1020: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
1030: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
1040: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
1050: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
1060: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1070: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55   ROWS BETWEEN CU
1080: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
1090: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
10a0: 47 0a 2a 2a 0a 2a 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d  G.**.**=========
10b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
10f0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
1100: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1110: 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
1120: 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 20 52  > PRECEDING.** R
1130: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
1140: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
1150: 41 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45  AND <expr> PRECE
1160: 44 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54  DING.** ROWS BET
1170: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
1180: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 43 55 52  EDING    AND CUR
1190: 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57 53  RENT ROW.** ROWS
11a0: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
11b0: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
11c0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
11d0: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
11e0: 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  N <expr> PRECEDI
11f0: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
1200: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f   FOLLOWING.** RO
1210: 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  WS BETWEEN CURRE
1220: 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20 20 41  NT ROW         A
1230: 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  ND <expr> FOLLOW
1240: 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  ING.** ROWS BETW
1250: 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  EEN <expr> FOLLO
1260: 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70  WING    AND <exp
1270: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  r> FOLLOWING.** 
1280: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
1290: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
12a0: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
12b0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
12c0: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
12d0: 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20 41 4e 44  FOLLOWING    AND
12e0: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
12f0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 43 61 73  WING.**.**   Cas
1300: 65 73 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 20  es that involve 
1310: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
1320: 20 6f 72 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f   or <expr> FOLLO
1330: 57 49 4e 47 2e 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  WING..**.**   ..
1340: 2e 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  ..**     Insert 
1350: 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74  (record in eph-t
1360: 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74  able).**   sqlit
1370: 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 0a  e3WhereEnd().**.
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
1390: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20  indowCodeStep(. 
13a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20  .  Select *p,.  
13c0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
13d0: 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  o,.  int regGosu
13e0: 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  b, .  int addrGo
13f0: 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76  sub.){.  Vdbe *v
1400: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1410: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
1420: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e  dow *pWin;.  Win
1430: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
1440: 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  pWin;.  int k;. 
1450: 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70   int iSubCsr = p
1460: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ->pSrc->a[0].iCu
1470: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62  rsor;.  int nSub
1480: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1490: 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69  .pTab->nCol;.  i
14a0: 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt reg = pParse-
14b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72  >nMem+1;.  int r
14c0: 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e  egRecord = reg+n
14d0: 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Sub;.  int regRo
14e0: 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b  wid = regRecord+
14f0: 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  1;.  int addr;..
1500: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1510: 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f  = nSub + 2;..  /
1520: 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72 6f  * Martial the ro
1530: 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  w returned by th
1540: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74  e sub-select int
1550: 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 20  o an array of . 
1560: 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a   ** registers. *
1570: 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e  /.  for(k=0; k<n
1580: 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73  Sub; k++){.    s
1590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
15b0: 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b  SubCsr, k, reg+k
15c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
15d0: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ck if this is th
15e0: 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
15f0: 20 70 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65   partition or pe
1600: 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69  er group. */.  i
1610: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  f( pMWin->regPar
1620: 74 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  t ){.    ExprLis
1630: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
1640: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
1650: 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70    int nPart = (p
1660: 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45  Part ? pPart->nE
1670: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 45 78  xpr : 0);.    Ex
1680: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1690: 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
16a0: 42 79 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65  By;.    int nPee
16b0: 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
16c0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
16d0: 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  : 0);.    int ad
16e0: 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20  drGoto = 0;.    
16f0: 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
1700: 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 74  ;..    if( pPart
1710: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
1720: 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b  gNewPart = reg +
1730: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
1740: 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ol;.      KeyInf
1750: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
1760: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
1770: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1780: 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20   pPart, 0, 0);. 
1790: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17b0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
17c0: 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
17d0: 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 29 3b  regPart, nPart);
17e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17f0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
1800: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
1810: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
1820: 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c    addrJump = sql
1830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1840: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b  , OP_Jump, addr+
1850: 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20  2, 0, addr+2);. 
1860: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d       for(pWin=pM
1870: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
1880: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
1890: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18b0: 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d  _AggFinal, pWin-
18c0: 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d  >regAccum, pWin-
18d0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  >nArg);.        
18e0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
18f0: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
1900: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1920: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1930: 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67  _Copy, pWin->reg
1940: 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  Accum, pWin->reg
1950: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
1960: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
1970: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rBy ){.        a
1980: 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
1990: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
19a0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d  P_Goto);.      }
19b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
19c0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
19d0: 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72    int regNewPeer
19e0: 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
19f0: 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61  nBufferCol + nPa
1a00: 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  rt;.      int re
1a10: 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
1a20: 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a  egPart + nPart;.
1a30: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
1a40: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
1a50: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
1a60: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
1a70: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
1a80: 20 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d       if( addrJum
1a90: 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
1aa0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
1ab0: 75 6d 70 29 3b 0a 20 20 20 20 20 20 61 64 64 72  ump);.      addr
1ac0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ad0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
1ae0: 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20  re, regNewPeer, 
1af0: 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b  regPeer, nPeer);
1b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b10: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
1b20: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
1b30: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
1b40: 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c    addrJump = sql
1b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b60: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b  , OP_Jump, addr+
1b70: 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20  2, 0, addr+2);. 
1b80: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d       for(pWin=pM
1b90: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
1ba0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
1bb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 0a 20  VdbeAddOp3(v, . 
1bd0: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 41 67             OP_Ag
1be0: 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65  gFinal, pWin->re
1bf0: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41  gAccum, pWin->nA
1c00: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  rg, pWin->regRes
1c10: 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
1c20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c30: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1c40: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
1c50: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
1c60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
1c70: 64 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33  drGoto ) sqlite3
1c80: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1c90: 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d  addrGoto);.    }
1ca0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
1cb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1cc0: 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
1cd0: 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73  ddrGosub);.    s
1ce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1cf0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
1d00: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
1d10: 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
1d20: 56 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20  VdbeAddOp3(.    
1d30: 20 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20      v, OP_Copy, 
1d40: 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  reg+pMWin->nBuff
1d50: 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65  erCol, pMWin->re
1d60: 67 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65  gPart, nPart+nPe
1d70: 65 72 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  er-1.        );.
1d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d90: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1da0: 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Jump);.  }..  /*
1db0: 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75 6e   Invoke step fun
1dc0: 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f 77  ction for window
1dd0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
1de0: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
1df0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
1e00: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
1e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e20: 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30  3(v, OP_AggStep0
1e30: 2c 20 30 2c 20 72 65 67 2b 70 57 69 6e 2d 3e 69  , 0, reg+pWin->i
1e40: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
1e50: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 73 71 6c  gAccum);.    sql
1e60: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1e70: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
1e80: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1ea0: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 70 57 69  ngeP5(v, (u8)pWi
1eb0: 6e 2d 3e 6e 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  n->nArg);.  }.. 
1ec0: 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
1ed0: 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
1ee0: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
1ef0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  e. */.  if( pMWi
1f00: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20  n->nBufferCol>0 
1f10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1f20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
1f30: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
1f40: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
1f50: 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
1f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1f70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f80: 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67   OP_Blob, 0, reg
1f90: 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
1fa0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
1fb0: 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30  (v, (void*)"", 0
1fc0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fe0: 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e  _NewRowid, pMWin
1ff0: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f  ->iEphCsr, regRo
2000: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
2010: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2020: 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69  Insert, pMWin->i
2030: 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72  EphCsr, regRecor
2040: 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  d, regRowid);.. 
2050: 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
2060: 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20  base scan loop. 
2070: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
2080: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
2090: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
20a0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
20b0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
20c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20d0: 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
20e0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  l, pWin->regAccu
20f0: 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29 3b 0a  m, pWin->nArg);.
2100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2110: 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d  ppendP4(v, pWin-
2120: 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2130: 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2140: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2150: 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67  _Copy, pWin->reg
2160: 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  Accum, pWin->reg
2170: 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 73  Result);.  }.  s
2180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2190: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21a0: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
21b0: 62 29 3b 0a 7d 0a 0a 0a                          b);.}...