/ Hex Artifact Content
Login

Artifact e4441e8ee3f83df85ff542048d3eed1c199ce6f90f3edcfeb1c4c1f53991b125:


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 53 74 61 72 74 2c 20 45  .  int eStart, E
02f0: 78 70 72 20 2a 70 53 74 61 72 74 2c 0a 20 20 69  xpr *pStart,.  i
0300: 6e 74 20 65 45 6e 64 2c 20 45 78 70 72 20 2a 70  nt eEnd, Expr *p
0310: 45 6e 64 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20  End.){.  Window 
0320: 2a 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a  *pWin = (Window*
0330: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
0340: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
0350: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
0360: 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ;..  if( pWin ){
0370: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65  .    pWin->eType
0380: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 70 57   = eType;.    pW
0390: 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53 74  in->eStart = eSt
03a0: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
03b0: 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 20 20  End = eEnd;.    
03c0: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 45 6e  pWin->pEnd = pEn
03d0: 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74  d;.    pWin->pSt
03e0: 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  art = pStart;.  
03f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
0400: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
0410: 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a  rse->db, pEnd);.
0420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0430: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
0440: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  , pStart);.  }..
0450: 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d    return pWin;.}
0460: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  ..void sqlite3Wi
0470: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
0480: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0490: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
04a0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
04b0: 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b   p->pWin = pWin;
04c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
04d0: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
04e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  e(pParse->db, pW
04f0: 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  in);.  }.}../*.*
0500: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
0510: 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a  e two window obj
0520: 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63  ects are identic
0530: 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  al, or non-zero 
0540: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
0550: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
0560: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
0570: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
0580: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
0590: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
05a0: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
05b0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
05c0: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
05d0: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
05e0: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
05f0: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
0600: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
0610: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
0620: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
0630: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
0640: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
0650: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
0660: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
0670: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
0680: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
0690: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
06a0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
06b0: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
06c0: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
06d0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
06e0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
06f0: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
0700: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
0710: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
0720: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
0730: 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69   0;.}..void sqli
0740: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69  te3WindowCodeIni
0750: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
0760: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
0770: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
0780: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0790: 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20  e);.  int nPart 
07a0: 3d 20 28 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  = (pWin->pPartit
07b0: 69 6f 6e 20 3f 20 70 57 69 6e 2d 3e 70 50 61 72  ion ? pWin->pPar
07c0: 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20  tition->nExpr : 
07d0: 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28  0);.  nPart += (
07e0: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f  pWin->pOrderBy ?
07f0: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d   pWin->pOrderBy-
0800: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69  >nExpr : 0);.  i
0810: 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20  f( nPart ){.    
0820: 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20  pWin->regPart = 
0830: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
0840: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
0850: 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73   += nPart;.    s
0860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
0870: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
0880: 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70  pWin->regPart, p
0890: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61  Win->regPart+nPa
08a0: 72 74 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  rt-1);.  }.}..st
08b0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
08c0: 43 68 65 63 6b 46 72 61 6d 65 56 61 6c 75 65 28  CheckFrameValue(
08d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
08e0: 6e 74 20 72 65 67 2c 20 69 6e 74 20 62 45 6e 64  nt reg, int bEnd
08f0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
0900: 74 20 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20  t char *azErr[] 
0910: 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73  = {.    "frame s
0920: 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d  tarting offset m
0930: 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67  ust be a non-neg
0940: 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a  ative integer",.
0950: 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e      "frame endin
0960: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
0970: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
0980: 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20  integer".  };.  
0990: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
09a0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
09b0: 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20  ;.  int regZero 
09c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
09d0: 3b 0a 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ;...  sqlite3Vdb
09e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
09f0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a 65 72  teger, 0, regZer
0a00: 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  o);.  sqlite3Vdb
0a10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
0a20: 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20 73 71  stBeInt, reg, sq
0a30: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
0a40: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 73 71  Addr(v)+2);.  sq
0a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0a60: 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 5a 65 72  v, OP_Ge, regZer
0a70: 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  o, sqlite3VdbeCu
0a80: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
0a90: 72 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  reg);.  sqlite3V
0aa0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
0ab0: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52 52  Halt, SQLITE_ERR
0ac0: 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  OR, OE_Abort);. 
0ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
0ae0: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 61  ndP4(v, (void*)a
0af0: 7a 45 72 72 5b 62 45 6e 64 5d 2c 20 50 34 5f 53  zErr[bEnd], P4_S
0b00: 54 41 54 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69  TATIC);.}..stati
0b10: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67  c void windowAgg
0b20: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
0b30: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
0b40: 20 2a 70 4d 57 69 6e 2c 20 0a 20 20 69 6e 74 20   *pMWin, .  int 
0b50: 63 73 72 2c 0a 20 20 69 6e 74 20 62 49 6e 76 65  csr,.  int bInve
0b60: 72 73 65 2c 20 0a 20 20 69 6e 74 20 72 65 67 0a  rse, .  int reg.
0b70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
0b80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0b90: 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20  arse);.  Window 
0ba0: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
0bb0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
0bc0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
0bd0: 69 6e 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  in){.    int i;.
0be0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
0bf0: 57 69 6e 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b  Win->nArg; i++){
0c00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
0c10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
0c20: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
0c30: 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67  ->iArgCol+i, reg
0c40: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +i);.    }.    s
0c50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
0c60: 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c  (v, OP_AggStep0,
0c70: 20 62 49 6e 76 65 72 73 65 2c 20 72 65 67 2c 20   bInverse, reg, 
0c80: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
0c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0ca0: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
0cb0: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
0cc0: 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
0cd0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
0ce0: 20 28 75 38 29 70 57 69 6e 2d 3e 6e 41 72 67 29   (u8)pWin->nArg)
0cf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
0d00: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
0d10: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
0d20: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
0d30: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  WING.**.**   ...
0d40: 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20  .**     if( new 
0d50: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
0d60: 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
0d70: 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20  h_partition.**  
0d80: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65     }.**     Inse
0d90: 72 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70  rt (record in ep
0da0: 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71  h-table).**   sq
0db0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
0dc0: 2a 2a 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68  **   Gosub flush
0dd0: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 0a 2a 2a  _partition.**.**
0de0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
0df0: 3a 0a 2a 2a 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  :.**   Once {.**
0e00: 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45       OpenDup (iE
0e10: 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74 61 72  phCsr -> csrStar
0e20: 74 29 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 44 75  t).**     OpenDu
0e30: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
0e40: 72 45 6e 64 29 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  rEnd).**   }.** 
0e50: 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
0e60: 70 72 31 3e 20 20 20 20 20 20 20 20 20 20 20 20  pr1>            
0e70: 2f 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70  // PRECEDING exp
0e80: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 72 65 67  ression.**   reg
0e90: 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20  End = <expr2>   
0ea0: 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57         // FOLLOW
0eb0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ING expression.*
0ec0: 2a 20 20 20 69 66 28 20 72 65 67 53 74 61 72 74  *   if( regStart
0ed0: 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20 29  <0 || regEnd<0 )
0ee0: 20 74 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e   throw exception
0ef0: 21 0a 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63  !.**   Rewind (c
0f00: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
0f10: 6e 64 29 20 20 20 20 20 20 20 2f 2f 20 69 66 20  nd)       // if 
0f20: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
0f30: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
0f40: 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73       Aggstep (cs
0f50: 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e 65 78  rEnd).**     Nex
0f60: 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20  t(csrEnd)       
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
0f80: 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72   if EOF fall-thr
0f90: 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28 20  ough.**     if( 
0fa0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
0fb0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
0fc0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
0fd0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
0fe0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65  osub.**       Ne
0ff0: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
1000: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
1010: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
1020: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
1030: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
1040: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
1050: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
1060: 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73  srStart, xInvers
1070: 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  e).**         Ne
1080: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
1090: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
10a0: 0a 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74  .** flush_partit
10b0: 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20 20 52  ion_done:.**   R
10c0: 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72 29  esetSorter (csr)
10d0: 0a 2a 2a 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  .**   Return.**.
10e0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
10f0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
1100: 20 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20      AND CURRENT 
1110: 52 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  ROW.** ROWS BETW
1120: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
1130: 20 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70          AND <exp
1140: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  r> FOLLOWING.** 
1150: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
1160: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
1170: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
1180: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
1190: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
11a0: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
11b0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
11c0: 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20  G.**.**   These 
11d0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  are similar to t
11e0: 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20 22 43  he above. For "C
11f0: 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74  URRENT ROW", int
1200: 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20  ialize the.**   
1210: 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e 20 46  register to 0. F
1220: 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20 2e 2e  or "UNBOUNDED ..
1230: 2e 22 20 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a  ." to infinity..
1240: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
1250: 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  EN <expr> FOLLOW
1260: 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72  ING    AND <expr
1270: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
1280: 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67  *   regEnd = reg
1290: 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a  End - regStart.*
12a0: 2a 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c  *   Rewind (csr,
12b0: 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29  csrStart,csrEnd)
12c0: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
12d0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
12e0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67  n_done.**     Ag
12f0: 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a  gstep (csrEnd).*
1300: 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e  *     Next(csrEn
1310: 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d)              
1320: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c     // if EOF fal
1330: 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20  l-through.**    
1340: 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c   if( (regEnd--)<
1350: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  =0 ){.**       A
1360: 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72 74  ggStep (csrStart
1370: 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20  , xInverse).**  
1380: 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 53 74       Next (csrSt
1390: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 69 66  art).**       if
13a0: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
13b0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
13c0: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
13d0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
13e0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
13f0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
1400: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
1410: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
1420: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
1430: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ne.**       }.**
1440: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57       }.**.** ROW
1450: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
1460: 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e   PRECEDING    AN
1470: 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  D <expr> PRECEDI
1480: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c 61  NG.**.**   Repla
1490: 63 65 20 74 68 65 20 62 69 74 20 61 66 74 65 72  ce the bit after
14a0: 20 22 52 65 77 69 6e 64 22 20 69 6e 20 74 68 65   "Rewind" in the
14b0: 20 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a 0a   above with:.**.
14c0: 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67 45  **     if( (regE
14d0: 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
14e0: 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
14f0: 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 4e  rEnd).**       N
1500: 65 78 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  ext (csrEnd).** 
1510: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67      }.**     Agg
1520: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
1530: 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72  *     Gosub addr
1540: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78  Gosub.**     Nex
1550: 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20  t(csr)          
1560: 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f          // if EO
1570: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
1580: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
1590: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
15a0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
15b0: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 32     AggStep (csr2
15c0: 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20  , xInverse).**  
15d0: 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29       Next (csr2)
15e0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a  .**     }.**.*/.
15f0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
1600: 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65  owCodeRowExprSte
1610: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
1620: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
1630: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
1640: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
1650: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
1660: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
1670: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
1680: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
1690: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
16b0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20  ow *pWin;.  int 
16c0: 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72  k;.  int iSubCsr
16d0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
16e0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  .iCursor;.  int 
16f0: 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSub = p->pSrc->
1700: 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
1710: 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50  .  int regFlushP
1720: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
1730: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
1740: 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f  or "Gosub flush_
1750: 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20  partition" */.  
1760: 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  int lblFlushPart
1770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1780: 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f  /* Label for "Go
1790: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
17a0: 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ion" */.  int lb
17b0: 6c 46 6c 75 73 68 44 6f 6e 65 3b 20 20 20 20 20  lFlushDone;     
17c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
17d0: 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  el for "Gosub fl
17e0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
17f0: 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65  ne" */..  int re
1800: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
1810: 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  +1;.  int regRec
1820: 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a  ord = reg+nSub;.
1830: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
1840: 20 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20   regRecord+1;.  
1850: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
1860: 63 73 72 53 74 61 72 74 20 3d 20 70 50 61 72 73  csrStart = pPars
1870: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74  e->nTab++;.  int
1880: 20 63 73 72 45 6e 64 20 3d 20 70 50 61 72 73 65   csrEnd = pParse
1890: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20  ->nTab++;.  int 
18a0: 72 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20  regStart;       
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c0: 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20  Value of <expr> 
18d0: 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69  PRECEDING */.  i
18e0: 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20  nt regEnd;      
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70  /* Value of <exp
1910: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a  r> FOLLOWING */.
1920: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a    int addrNext;.
1930: 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a    int addrGoto;.
1940: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20    int addrTop;. 
1950: 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73 31 3b   int addrIfPos1;
1960: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
1970: 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  2;..  assert( pM
1980: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
1990: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20 20  PRECEDING .     
19a0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
19b0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
19c0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
19d0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
19e0: 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
19f0: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
1a00: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
1a10: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
1a20: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
1a30: 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NT .       || pM
1a40: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
1a50: 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20 20 20  BOUNDED .       
1a60: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
1a70: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
1a80: 29 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  );..  pParse->nM
1a90: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
1aa0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
1ab0: 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65  egister and labe
1ac0: 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68  l for the "flush
1ad0: 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d  _partition" sub-
1ae0: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65  routine. */.  re
1af0: 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
1b00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c  Parse->nMem;.  l
1b10: 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71  blFlushPart = sq
1b20: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b30: 65 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73  el(v);.  lblFlus
1b40: 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  hDone = sqlite3V
1b50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b60: 0a 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b  ..  regStart = +
1b70: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1b80: 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72   regEnd = ++pPar
1b90: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20  se->nMem;..  /* 
1ba0: 4d 61 72 74 69 61 6c 20 74 68 65 20 72 6f 77 20  Martial the row 
1bb0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1bc0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20  sub-select into 
1bd0: 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 20 20 2a  an array of .  *
1be0: 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  * registers. */.
1bf0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75    for(k=0; k<nSu
1c00: 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  b; k++){.    sql
1c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1c20: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75  , OP_Column, iSu
1c30: 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b  bCsr, k, reg+k);
1c40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1c50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
1c60: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
1c70: 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29  nSub, regRecord)
1c80: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
1c90: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61   this is the sta
1ca0: 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74  rt of a new part
1cb0: 69 74 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63 61  ition. If so, ca
1cc0: 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75 73  ll the.  ** flus
1cd0: 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 2d  h_partition sub-
1ce0: 72 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20 69  routine.  */.  i
1cf0: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
1d00: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  tion ){.    Expr
1d10: 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
1d20: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
1d30: 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  .    int nPart =
1d40: 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d   (pPart ? pPart-
1d50: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
1d60: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
1d70: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65  0;.    int regNe
1d80: 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d  wPart = reg + pM
1d90: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
1da0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1db0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
1dc0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
1dd0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72  ist(pParse, pPar
1de0: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61  t, 0, 0);..    a
1df0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1e00: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1e10: 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72  mpare, regNewPar
1e20: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
1e30: 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71  t,nPart);.    sq
1e40: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
1e50: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
1e60: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1e70: 29 3b 0a 20 20 20 20 61 64 64 72 4a 75 6d 70 20  );.    addrJump 
1e80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1e90: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1ea0: 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
1eb0: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 73 71 6c  addr+2);.    sql
1ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ed0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46  , OP_Gosub, regF
1ee0: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
1ef0: 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  shPart);.    sql
1f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f10: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
1f20: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
1f30: 67 50 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20  gPart, nPart);. 
1f40: 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20   }..  /* Buffer 
1f50: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1f60: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
1f70: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
1f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f90: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
1fa0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
1fb0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
1fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1fd0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
1fe0: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
1ff0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
2000: 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ;..  /* End of t
2010: 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
2020: 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
2030: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
2040: 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f  * Invoke "flush_
2050: 70 61 72 74 69 74 69 6f 6e 22 20 74 6f 20 64 65  partition" to de
2060: 61 6c 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  al with the fina
2070: 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74  l (or only) part
2080: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
2090: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20a0: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
20b0: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
20c0: 50 61 72 74 29 3b 0a 20 20 61 64 64 72 47 6f 74  Part);.  addrGot
20d0: 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
20e0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
20f0: 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70  );..  /* flush_p
2100: 61 72 74 69 74 69 6f 6e 3a 20 2a 2f 0a 20 20 73  artition: */.  s
2110: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2120: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75  eLabel(v, lblFlu
2130: 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74  shPart);.  sqlit
2140: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2150: 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69  OP_Once, 0, sqli
2160: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2170: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
2180: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2190: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
21a0: 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  Start, pMWin->iE
21b0: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
21c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21d0: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e  P_OpenDup, csrEn
21e0: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
21f0: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74  r);..  /* If eit
2200: 68 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20  her regStart or 
2210: 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e  regEnd are not n
2220: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
2230: 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a  gers, throw .  *
2240: 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  * an exception. 
2250: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
2260: 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 61  >pStart ){.    a
2270: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
2280: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
2290: 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NG );.    sqlite
22a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
22b0: 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c  , pMWin->pStart,
22c0: 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
22d0: 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65  windowCheckFrame
22e0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
22f0: 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d 0a  gStart, 0);.  }.
2300: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e    if( pMWin->pEn
2310: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
2320: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2330: 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65   pMWin->pEnd, re
2340: 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f  gEnd);.    windo
2350: 77 43 68 65 63 6b 46 72 61 6d 65 56 61 6c 75 65  wCheckFrameValue
2360: 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c  (pParse, regEnd,
2370: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28   1);.  }..  for(
2380: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
2390: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
23a0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69  xtWin){.    sqli
23b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23c0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
23d0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
23e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
2400: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
2410: 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  um);.  }..  sqli
2420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2430: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69   OP_Rewind, pMWi
2440: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46  n->iEphCsr, lblF
2450: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c  lushDone);.  sql
2460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2470: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
2480: 53 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44  Start, lblFlushD
2490: 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  one);.  sqlite3V
24a0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
24b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
24c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
24d0: 69 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c  ind, csrEnd, lbl
24e0: 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71  FlushDone);.  sq
24f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2500: 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49  5(v, 1);..  /* I
2510: 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75  nvoke AggStep fu
2520: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
2530: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
2540: 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68  using the row th
2550: 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63  at.  ** csrEnd c
2560: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
2570: 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e  to. Or, if csrEn
2580: 64 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  d is already at 
2590: 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  EOF,.  ** do not
25a0: 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72  hing.  */.  addr
25b0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
25c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
25d0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
25e0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
25f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
2600: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
2610: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
2620: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
2630: 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2650: 50 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20  P_Next, csrEnd, 
2660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2670: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
26a0: 6f 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67  oto);.  windowAg
26b0: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
26c0: 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20  Win, csrEnd, 0, 
26d0: 72 65 67 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  reg);.  if( pMWi
26e0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
26f0: 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  UNDED ){.    sql
2700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2710: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
2720: 64 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  drTop);.    sqli
2730: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2740: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 61 64  v, addr);.    ad
2750: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
2760: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2770: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2780: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2790: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
27a0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
27b0: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
27c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
27e0: 61 64 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 20  addrIfPos1);.   
27f0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d   }.  }..  if( pM
2800: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
2810: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61  LLOWING ){.    a
2820: 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69  ddrIfPos1 = sqli
2830: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2840: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
2850: 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 7d 0a 20  d, 0 , 1);.  }. 
2860: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
2870: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
2880: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
2890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28a0: 70 33 28 76 2c 20 0a 20 20 20 20 20 20 20 20 4f  p3(v, .        O
28b0: 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e  P_AggFinal, pWin
28c0: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e  ->regAccum, pWin
28d0: 2d 3e 6e 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  ->nArg, pWin->re
28e0: 67 52 65 73 75 6c 74 0a 20 20 20 20 29 3b 0a 20  gResult.    );. 
28f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2900: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
2910: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2920: 46 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  F);.  }.  sqlite
2930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2940: 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
2950: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2970: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
2980: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73  MWin->iEphCsr, s
2990: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
29a0: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 73  tAddr(v)+2);.  s
29b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
29c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
29d0: 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 0a  lblFlushDone);..
29e0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
29f0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
2a00: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
2a10: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
2a20: 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  {.    if( pMWin-
2a30: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
2a40: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 61  EDING ){.      a
2a50: 64 64 72 49 66 50 6f 73 32 20 3d 20 73 71 6c 69  ddrIfPos2 = sqli
2a60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2a70: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74   OP_IfPos, regSt
2a80: 61 72 74 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20  art, 0 , 1);.   
2a90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2aa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
2ab0: 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73  ext, csrStart, s
2ac0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2ad0: 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20  tAddr(v)+1);.   
2ae0: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
2af0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
2b00: 72 53 74 61 72 74 2c 20 31 2c 20 72 65 67 29 3b  rStart, 1, reg);
2b10: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
2b20: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
2b30: 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  DING ){.      sq
2b40: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2b50: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29  e(v, addrIfPos2)
2b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2b70: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
2b80: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
2b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2ba0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
2bb0: 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Pos1);.  }.  sql
2bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bd0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
2be0: 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66 6c  drTop);..  /* fl
2bf0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
2c00: 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ne: */.  sqlite3
2c10: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c20: 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  (v, lblFlushDone
2c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2c40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
2c50: 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d  etSorter, pMWin-
2c60: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c  >iEphCsr);.  sql
2c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2c80: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2c90: 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f  FlushPart);..  /
2ca0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74  * Jump to here t
2cb0: 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73  o skip over flus
2cc0: 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20  h_partition */. 
2cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2ce0: 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f  Here(v, addrGoto
2cf0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2d00: 64 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  d windowCodeDefa
2d10: 75 6c 74 53 74 65 70 28 0a 20 20 50 61 72 73 65  ultStep(.  Parse
2d20: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
2d30: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
2d40: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
2d50: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
2d60: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
2d70: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
2d80: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
2d90: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
2da0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2db0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
2dc0: 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 69    int k;.  int i
2dd0: 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63  SubCsr = p->pSrc
2de0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
2df0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e    int nSub = p->
2e00: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d  pSrc->a[0].pTab-
2e10: 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67  >nCol;.  int reg
2e20: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2e30: 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  1;.  int regReco
2e40: 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20  rd = reg+nSub;. 
2e50: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
2e60: 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20 69  regRecord+1;.  i
2e70: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 70 50 61 72  nt addr;..  pPar
2e80: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62  se->nMem += nSub
2e90: 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74   + 2;..  /* Mart
2ea0: 69 61 6c 20 74 68 65 20 72 6f 77 20 72 65 74 75  ial the row retu
2eb0: 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  rned by the sub-
2ec0: 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20 61  select into an a
2ed0: 72 72 61 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65  rray of .  ** re
2ee0: 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f  gisters. */.  fo
2ef0: 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b  r(k=0; k<nSub; k
2f00: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2f10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2f20: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72  _Column, iSubCsr
2f30: 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d  , k, reg+k);.  }
2f40: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
2f50: 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72  this is the star
2f60: 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69  t of a new parti
2f70: 74 69 6f 6e 20 6f 72 20 70 65 65 72 20 67 72 6f  tion or peer gro
2f80: 75 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  up. */.  if( pMW
2f90: 69 6e 2d 3e 72 65 67 50 61 72 74 20 29 7b 0a 20  in->regPart ){. 
2fa0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61     ExprList *pPa
2fb0: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
2fc0: 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  tition;.    int 
2fd0: 6e 50 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f  nPart = (pPart ?
2fe0: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
2ff0: 30 29 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  0);.    ExprList
3000: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
3010: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
3020: 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70    int nPeer = (p
3030: 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
3040: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
3050: 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f      int addrGoto
3060: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 61 64   = 0;.    int ad
3070: 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 0a 20 20 20  drJump = 0;..   
3080: 20 69 66 28 20 70 50 61 72 74 20 29 7b 0a 20 20   if( pPart ){.  
3090: 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61      int regNewPa
30a0: 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e  rt = reg + pMWin
30b0: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20  ->nBufferCol;.  
30c0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
30d0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
30e0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
30f0: 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  st(pParse, pPart
3100: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
3110: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
3120: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
3130: 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72  mpare, regNewPar
3140: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
3150: 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 20 20  t,nPart);.      
3160: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
3170: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
3180: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
3190: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a  FO);.      addrJ
31a0: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
31b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
31c0: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61  mp, addr+2, 0, a
31d0: 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 66 6f  ddr+2);.      fo
31e0: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
31f0: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
3200: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
3210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3220: 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
3230: 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  al, pWin->regAcc
3240: 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29 3b  um, pWin->nArg);
3250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3260: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
3270: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
3280: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
3290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32a0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
32b0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20  pWin->regAccum, 
32c0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
32d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32e0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
32f0: 20 20 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f          addrGoto
3300: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3310: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
3320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3330: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
3340: 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  y ){.      int r
3350: 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 20  egNewPeer = reg 
3360: 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
3370: 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20  Col + nPart;.   
3380: 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d     int regPeer =
3390: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
33a0: 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20 20  + nPart;..      
33b0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
33c0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
33d0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
33e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
33f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3400: 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
3410: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3420: 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
3430: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
3440: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3450: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
3460: 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
3470: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
3480: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
3490: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
34a0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
34b0: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a  FO);.      addrJ
34c0: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
34d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
34e0: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61  mp, addr+2, 0, a
34f0: 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 66 6f  ddr+2);.      fo
3500: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
3510: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
3520: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
3530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3540: 4f 70 33 28 76 2c 20 0a 20 20 20 20 20 20 20 20  Op3(v, .        
3550: 20 20 20 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c      OP_AggFinal,
3560: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
3570: 20 70 57 69 6e 2d 3e 6e 41 72 67 2c 20 70 57 69   pWin->nArg, pWi
3580: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 0a 20 20 20  n->regResult.   
3590: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
35a0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
35b0: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
35c0: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
35d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35e0: 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71  f( addrGoto ) sq
35f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3600: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
3610: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
3620: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3630: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
3640: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
3650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3660: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
3670: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
3680: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73 71  iEphCsr);.    sq
3690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
36a0: 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 43  .        v, OP_C
36b0: 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d 3e  opy, reg+pMWin->
36c0: 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57 69  nBufferCol, pMWi
36d0: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
36e0: 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29 3b  t+nPeer-1.    );
36f0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
3700: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3710: 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rJump);.  }..  /
3720: 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75  * Invoke step fu
3730: 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f  nction for windo
3740: 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
3750: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
3760: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
3770: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
3780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3790: 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
37a0: 30 2c 20 30 2c 20 72 65 67 2b 70 57 69 6e 2d 3e  0, 0, reg+pWin->
37b0: 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72  iArgCol, pWin->r
37c0: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 73 71  egAccum);.    sq
37d0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
37e0: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
37f0: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
3800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
3810: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 70 57  angeP5(v, (u8)pW
3820: 69 6e 2d 3e 6e 41 72 67 29 3b 0a 20 20 7d 0a 0a  in->nArg);.  }..
3830: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20    /* Buffer the 
3840: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74  current row in t
3850: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
3860: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  le. */.  if( pMW
3870: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30  in->nBufferCol>0
3880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3890: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
38a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
38b0: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
38c0: 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
38d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
38e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
38f0: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65  , OP_Blob, 0, re
3900: 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71  gRecord);.    sq
3910: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
3920: 34 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20  4(v, (void*)"", 
3930: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
3940: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3950: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
3960: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
3970: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
3980: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3990: 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
39a0: 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
39b0: 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
39c0: 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
39d0: 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
39e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
39f0: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
3a00: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
3a10: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
3a20: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
3a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3a40: 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
3a50: 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  al, pWin->regAcc
3a60: 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29 3b  um, pWin->nArg);
3a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3a80: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
3a90: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
3aa0: 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
3ab0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3ac0: 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65  P_Copy, pWin->re
3ad0: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65  gAccum, pWin->re
3ae0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20  gResult);.  }.  
3af0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b00: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
3b10: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
3b20: 75 62 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ub);.}.../*.** R
3b30: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
3b40: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
3b50: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
3b60: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
3b70: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
3b80: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
3b90: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
3ba0: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
3bb0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
3bc0: 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
3bd0: 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
3be0: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
3bf0: 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
3c00: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
3c10: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
3c20: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
3c30: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
3c40: 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
3c50: 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
3c60: 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
3c70: 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
3c80: 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
3c90: 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
3ca0: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
3cb0: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
3cc0: 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
3cd0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
3ce0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
3cf0: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
3d00: 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
3d10: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
3d20: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
3d30: 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
3d40: 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
3d50: 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
3d60: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
3d70: 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
3d80: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
3d90: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
3da0: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
3db0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
3dc0: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
3dd0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
3de0: 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
3df0: 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
3e00: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
3e10: 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
3e20: 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
3e30: 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
3e40: 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
3e50: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
3e60: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
3e70: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
3e80: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 65 20 77  NG.**.**   One w
3e90: 61 79 20 69 73 20 74 6f 20 6a 75 73 74 20 72 65  ay is to just re
3ea0: 76 65 72 73 65 20 74 68 65 20 73 6f 72 74 20 6f  verse the sort o
3eb0: 72 64 65 72 20 61 6e 64 20 64 6f 20 61 73 20 66  rder and do as f
3ec0: 6f 72 20 42 45 54 57 45 45 4e 20 0a 2a 2a 20 20  or BETWEEN .**  
3ed0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
3ee0: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
3ef0: 20 52 4f 57 2e 20 42 75 74 20 74 68 61 74 20 69   ROW. But that i
3f00: 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20  s not quite the 
3f10: 73 61 6d 65 20 66 6f 72 0a 2a 2a 20 20 20 74 68  same for.**   th
3f20: 69 6e 67 73 20 6c 69 6b 65 20 67 72 6f 75 70 5f  ings like group_
3f30: 63 6f 6e 63 61 74 28 29 2e 20 41 6e 64 20 70 65  concat(). And pe
3f40: 72 68 61 70 73 20 6f 74 68 65 72 20 75 73 65 72  rhaps other user
3f50: 20 64 65 66 69 6e 65 64 20 61 67 67 72 65 67 61   defined aggrega
3f60: 74 65 73 20 0a 2a 2a 20 20 20 61 73 20 77 65 6c  tes .**   as wel
3f70: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a  l..**.**   ....*
3f80: 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
3f90: 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
3fa0: 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f      Gosub flush_
3fb0: 70 61 72 74 69 74 69 6f 6e 3b 0a 2a 2a 20 20 20  partition;.**   
3fc0: 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20      ResetSorter 
3fd0: 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20  eph-table.**    
3fe0: 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 53 74 65   }.**     AggSte
3ff0: 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  p.**     Insert 
4000: 28 72 65 63 6f 72 64 20 69 6e 74 6f 20 65 70 68  (record into eph
4010: 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c  -table).**   sql
4020: 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
4030: 2a 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f  *   Gosub flush_
4040: 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20  partition.**.** 
4050: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
4060: 3a 0a 2a 2a 20 20 20 4f 70 65 6e 44 75 70 20 28  :.**   OpenDup (
4070: 63 73 72 20 2d 3e 20 63 73 72 32 29 0a 2a 2a 20  csr -> csr2).** 
4080: 20 20 66 6f 72 65 61 63 68 20 28 72 65 63 6f 72    foreach (recor
4090: 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 20  d in eph-table) 
40a0: 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  {.**     if( new
40b0: 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20   peer ){.**     
40c0: 20 20 77 68 69 6c 65 28 20 63 73 72 32 21 3d 63    while( csr2!=c
40d0: 73 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  sr ){.**        
40e0: 20 41 67 67 53 74 65 70 20 28 78 49 6e 76 65 72   AggStep (xInver
40f0: 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  se).**         N
4100: 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20 20  ext (csr2).**   
4110: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
4120: 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28  *     AggFinal (
4130: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47  xValue).**     G
4140: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
4150: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 3d 3d 3d 3d 3d  *   }.**.**=====
4160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41a0: 3d 3d 3d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42  ===.**.** ROWS B
41b0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
41c0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
41d0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 20 20  URRENT ROW.**   
41e0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e  ....**     if( n
41f0: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
4200: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
4210: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
4220: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67       }.**     Ag
4230: 67 53 74 65 70 0a 2a 2a 20 20 20 20 20 41 67 67  gStep.**     Agg
4240: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
4250: 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72  *     Gosub addr
4260: 47 6f 73 75 62 0a 2a 2a 20 20 20 73 71 6c 69 74  Gosub.**   sqlit
4270: 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 0a  e3WhereEnd().**.
4280: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
4290: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
42a0: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
42b0: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52  D FOLLOWING.** R
42c0: 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52  OWS BETWEEN CURR
42d0: 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52  ENT ROW AND CURR
42e0: 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57 53 20  ENT ROW.** ROWS 
42f0: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
4300: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
4310: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  D FOLLOWING.**.*
4320: 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  *===============
4330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 0a 2a 2a 20  =========.**.** 
4370: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
4380: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
4390: 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43   AND <expr> PREC
43a0: 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65  EDING.**.**   Re
43b0: 70 6c 61 63 65 20 74 68 65 20 62 69 74 20 61 66  place the bit af
43c0: 74 65 72 20 22 52 65 77 69 6e 64 22 20 69 6e 20  ter "Rewind" in 
43d0: 74 68 65 20 61 62 6f 76 65 20 77 69 74 68 3a 0a  the above with:.
43e0: 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72  **.**     if( (r
43f0: 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
4400: 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20  *       AggStep 
4410: 28 63 73 72 33 29 0a 2a 2a 20 20 20 20 20 20 20  (csr3).**       
4420: 4e 65 78 74 20 28 63 73 72 33 29 0a 2a 2a 20 20  Next (csr3).**  
4430: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46     }.**     AggF
4440: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
4450: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
4460: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74  osub.**     Next
4470: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
4480: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
4490: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
44a0: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
44b0: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
44c0: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
44d0: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 32 2c    AggStep (csr2,
44e0: 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20   xInverse).**   
44f0: 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a      Next (csr2).
4500: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52  **     }.**.** R
4510: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
4520: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20  r> FOLLOWING    
4530: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
4540: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67  WING.**.**   reg
4550: 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72  End = regEnd - r
4560: 65 67 53 74 61 72 74 0a 2a 2a 20 20 20 52 65 77  egStart.**   Rew
4570: 69 6e 64 20 28 63 73 72 2c 63 73 72 32 2c 63 73  ind (csr,csr2,cs
4580: 72 33 29 20 20 20 20 20 20 20 2f 2f 20 69 66 20  r3)       // if 
4590: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
45a0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
45b0: 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73       Aggstep (cs
45c0: 72 33 29 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28  r3).**     Next(
45d0: 63 73 72 33 29 20 20 20 20 20 20 20 20 20 20 20  csr3)           
45e0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
45f0: 66 61 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20  fall-through.** 
4600: 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
4610: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
4620: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 32 2c    AggStep (csr2,
4630: 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20   xInverse).**   
4640: 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a      Next (csr2).
4650: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
4660: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
4670: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69  **         AggFi
4680: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
4690: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64          Gosub ad
46a0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
46b0: 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20     Next(csr)    
46c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
46d0: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
46e0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
46f0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
4700: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
4710: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
4720: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
4730: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  pr> PRECEDING.**
4740: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
4750: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20  xpr> FOLLOWING  
4760: 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20    AND UNBOUNDED 
4770: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
4780: 20 20 53 69 6d 69 6c 61 72 20 74 6f 20 74 68 65    Similar to the
4790: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 77   above, except w
47a0: 69 74 68 20 72 65 67 53 74 61 72 74 20 6f 72 20  ith regStart or 
47b0: 72 65 67 45 6e 64 20 73 65 74 20 74 6f 20 69 6e  regEnd set to in
47c0: 66 69 6e 69 74 79 2c 0a 2a 2a 20 20 20 61 73 20  finity,.**   as 
47d0: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a  appropriate..**.
47e0: 2a 2a 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  **.**.*/.void sq
47f0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
4800: 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
4810: 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20  arse, .  Select 
4820: 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p,.  WhereInfo 
4830: 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72  *pWInfo,.  int r
4840: 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20  egGosub, .  int 
4850: 61 64 64 72 47 6f 73 75 62 2c 0a 20 20 69 6e 74  addrGosub,.  int
4860: 20 2a 70 62 4c 6f 6f 70 0a 29 7b 0a 20 20 57 69   *pbLoop.){.  Wi
4870: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
4880: 3e 70 57 69 6e 3b 0a 0a 20 20 69 66 28 20 70 4d  >pWin;..  if( pM
4890: 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c 7c 20 70  Win->pStart || p
48a0: 4d 57 69 6e 2d 3e 70 45 6e 64 20 29 7b 0a 20 20  MWin->pEnd ){.  
48b0: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
48c0: 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20  >eType==TK_ROWS 
48d0: 29 3b 0a 20 20 20 20 2a 70 62 4c 6f 6f 70 20 3d  );.    *pbLoop =
48e0: 20 30 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   0;.    windowCo
48f0: 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 70 50  deRowExprStep(pP
4900: 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
4910: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
4920: 6f 73 75 62 29 3b 0a 20 20 20 20 72 65 74 75 72  osub);.    retur
4930: 6e 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62 4c 6f 6f  n;.  }..  *pbLoo
4940: 70 20 3d 20 31 3b 0a 20 20 77 69 6e 64 6f 77 43  p = 1;.  windowC
4950: 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 70  odeDefaultStep(p
4960: 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f  Parse, p, pWInfo
4970: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
4980: 47 6f 73 75 62 29 3b 0a 7d 0a 0a 0a              Gosub);.}...