/ Hex Artifact Content
Login

Artifact 31bd22def29a71144056ddd2a9c4344648c2b89f63a76e7695defdf7ed293216:


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 2f 2a 0a  qliteInt.h"../*.
0180: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0190: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
01a0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 6f  ndow function ro
01b0: 77 5f 6e 75 6d 62 65 72 28 29 2e 20 41 73 73 75  w_number(). Assu
01c0: 6d 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  mes that the.** 
01d0: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
01e0: 20 62 65 65 6e 20 63 6f 65 72 63 65 64 20 74 6f   been coerced to
01f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42  :.**.**   ROWS B
0200: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
0210: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
0220: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74  URRENT ROW.*/.st
0230: 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75  atic void row_nu
0240: 6d 62 65 72 53 74 65 70 46 75 6e 63 28 0a 20 20  mberStepFunc(.  
0250: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0260: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
0270: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
0280: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
0290: 20 69 36 34 20 2a 70 20 3d 20 28 69 36 34 2a 29   i64 *p = (i64*)
02a0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
02b0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
02c0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
02d0: 66 28 20 70 20 29 20 28 2a 70 29 2b 2b 3b 0a 7d  f( p ) (*p)++;.}
02e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77  .static void row
02f0: 5f 6e 75 6d 62 65 72 49 6e 76 65 72 73 65 46 75  _numberInverseFu
0300: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
0310: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
0320: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
0330: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
0340: 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  g.){.}.static vo
0350: 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 56 61 6c  id row_numberVal
0360: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
0370: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
0380: 20 69 36 34 20 2a 70 20 3d 20 28 69 36 34 2a 29   i64 *p = (i64*)
0390: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
03a0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
03b0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73  sizeof(*p));.  s
03c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
03d0: 74 36 34 28 70 43 74 78 2c 20 28 70 20 3f 20 2a  t64(pCtx, (p ? *
03e0: 70 20 3a 20 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p : 0));.}../*.*
03f0: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
0400: 20 74 79 70 65 20 75 73 65 64 20 62 79 20 72 61   type used by ra
0410: 6e 6b 28 29 20 61 6e 64 20 64 65 6e 73 65 5f 72  nk() and dense_r
0420: 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74  ank()..*/.struct
0430: 20 43 61 6c 6c 43 6f 75 6e 74 20 7b 0a 20 20 69   CallCount {.  i
0440: 36 34 20 6e 56 61 6c 75 65 3b 0a 20 20 69 36 34  64 nValue;.  i64
0450: 20 6e 53 74 65 70 3b 0a 20 20 69 36 34 20 6e 54   nStep;.  i64 nT
0460: 6f 74 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  otal;.};../*.** 
0470: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0480: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
0490: 77 20 66 75 6e 63 74 69 6f 6e 20 64 65 6e 73 65  w function dense
04a0: 5f 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74  _rank()..*/.stat
04b0: 69 63 20 76 6f 69 64 20 64 65 6e 73 65 5f 72 61  ic void dense_ra
04c0: 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71  nkStepFunc(.  sq
04d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
04e0: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
04f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
0500: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73  e **apArg.){.  s
0510: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
0520: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
0530: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
0540: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
0550: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
0560: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
0570: 70 20 29 20 70 2d 3e 6e 53 74 65 70 20 3d 20 31  p ) p->nStep = 1
0580: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
0590: 64 65 6e 73 65 5f 72 61 6e 6b 49 6e 76 65 72 73  dense_rankInvers
05a0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
05b0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
05c0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
05d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
05e0: 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63  pArg.){.}.static
05f0: 20 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b   void dense_rank
0600: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
0610: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
0620: 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43  {.  struct CallC
0630: 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28  ount *p;.  p = (
0640: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
0650: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
0660: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
0670: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
0680: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
0690: 28 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20  ( p->nStep ){.  
06a0: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b      p->nValue++;
06b0: 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  .      p->nStep 
06c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
06d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
06e0: 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61  t64(pCtx, p->nVa
06f0: 6c 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  lue);.  }.}../*.
0700: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0710: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
0720: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61  ndow function ra
0730: 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nk()..*/.static 
0740: 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46 75 6e  void rankStepFun
0750: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
0760: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
0770: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
0780: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
0790: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
07a0: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d  lCount *p;.  p =
07b0: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
07c0: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
07d0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
07e0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
07f0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0800: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20  p->nStep++;.    
0810: 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30  if( p->nValue==0
0820: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
0830: 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a  lue = p->nStep;.
0840: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
0850: 69 63 20 76 6f 69 64 20 72 61 6e 6b 49 6e 76 65  ic void rankInve
0860: 72 73 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  rseFunc(.  sqlit
0870: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
0880: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
0890: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
08a0: 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74  *apArg.){.}.stat
08b0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 56 61 6c 75  ic void rankValu
08c0: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
08d0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
08e0: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
08f0: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
0900: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
0910: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
0920: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
0930: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
0940: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
0950: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
0960: 43 74 78 2c 20 70 2d 3e 6e 56 61 6c 75 65 29 3b  Ctx, p->nValue);
0970: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d  .    p->nValue =
0980: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
0990: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
09a0: 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  of built-in wind
09b0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 63  ow function perc
09c0: 65 6e 74 5f 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73  ent_rank()..*/.s
09d0: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
09e0: 6e 74 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28  nt_rankStepFunc(
09f0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
0a00: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
0a10: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
0a20: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
0a30: 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43  {.  struct CallC
0a40: 6f 75 6e 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  ount *p;.  asser
0a50: 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 0a 20  t( nArg==1 );.. 
0a60: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
0a70: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
0a80: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
0a90: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
0ab0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61      if( p->nTota
0ac0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
0ad0: 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74 65  >nTotal = sqlite
0ae0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
0af0: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[0]);.    }. 
0b00: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
0b10: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
0b20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
0b30: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
0b40: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  p;.    }.  }.}.s
0b50: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
0b60: 6e 74 5f 72 61 6e 6b 49 6e 76 65 72 73 65 46 75  nt_rankInverseFu
0b70: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
0b80: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
0b90: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
0ba0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
0bb0: 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  g.){.}.static vo
0bc0: 69 64 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56  id percent_rankV
0bd0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
0be0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
0bf0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
0c00: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
0c10: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
0c20: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
0c30: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
0c40: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
0c50: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
0c60: 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b 0a   p->nTotal>1 ){.
0c70: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
0c80: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 56 61   (double)(p->nVa
0c90: 6c 75 65 2d 31 29 20 2f 20 28 64 6f 75 62 6c 65  lue-1) / (double
0ca0: 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a  )(p->nTotal-1);.
0cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0cc0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
0cd0: 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , r);.    }else{
0ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
0cf0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
0d00: 78 2c 20 31 30 30 2e 30 29 3b 0a 20 20 20 20 7d  x, 100.0);.    }
0d10: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d  .    p->nValue =
0d20: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
0d30: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
0d40: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
0d50: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
0d60: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
0d70: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0d80: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
0d90: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
0da0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
0db0: 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d 20 28 73  ==1 );..  p = (s
0dc0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
0dd0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
0de0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
0df0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
0e00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
0e10: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
0e20: 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c  .      p->nTotal
0e30: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0e40: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
0e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
0e60: 53 74 65 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  Step++;.  }.}.st
0e70: 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64  atic void cume_d
0e80: 69 73 74 49 6e 76 65 72 73 65 46 75 6e 63 28 0a  istInverseFunc(.
0e90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0ea0: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
0eb0: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
0ec0: 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
0ed0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
0ee0: 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46 75 6e  ume_distValueFun
0ef0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
0f00: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
0f10: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b  ct CallCount *p;
0f20: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43  .  p = (struct C
0f30: 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65  allCount*)sqlite
0f40: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
0f50: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
0f60: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
0f70: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
0f80: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
0f90: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
0fa0: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
0fb0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
0fc0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
0fd0: 20 7d 0a 7d 0a 0a 73 74 72 75 63 74 20 4e 74 69   }.}..struct Nti
0fe0: 6c 65 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 54  leCtx {.  i64 nT
0ff0: 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
1000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1010: 61 6c 20 72 6f 77 73 20 69 6e 20 70 61 72 74 69  al rows in parti
1020: 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 50  tion */.  i64 nP
1030: 61 72 61 6d 3b 20 20 20 20 20 20 20 20 20 20 20  aram;           
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1050: 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
1060: 20 6e 74 69 6c 65 28 4e 29 20 2a 2f 0a 20 20 69   ntile(N) */.  i
1070: 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1090: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f  * Current row */
10a0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
10b0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6e 74 69  mentation of nti
10c0: 6c 65 28 29 2e 20 54 68 69 73 20 61 73 73 75 6d  le(). This assum
10d0: 65 73 20 74 68 61 74 20 74 68 65 20 77 69 6e 64  es that the wind
10e0: 6f 77 20 66 72 61 6d 65 20 68 61 73 0a 2a 2a 20  ow frame has.** 
10f0: 62 65 65 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a  been coerced to:
1100: 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 55 4e  .**.**   ROWS UN
1110: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1120: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
1130: 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  W.*/.static void
1140: 20 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 28 0a   ntileStepFunc(.
1150: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1160: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
1170: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
1180: 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
1190: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
11a0: 74 78 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  tx *p;.  assert(
11b0: 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 70 20   nArg==2 );.  p 
11c0: 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43  = (struct NtileC
11d0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
11e0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
11f0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1200: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1210: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1220: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61   ){.      p->nPa
1230: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ram = sqlite3_va
1240: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1250: 30 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  0]);.      p->nT
1260: 6f 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  otal = sqlite3_v
1270: 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67  alue_int64(apArg
1280: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
1290: 70 2d 3e 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a  p->nParam<=0 ){.
12a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12b0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20  result_error(.  
12c0: 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2c 20            pCtx, 
12d0: 22 61 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69  "argument of nti
12e0: 6c 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73  le must be a pos
12f0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20  itive integer", 
1300: 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  -1.        );.  
1310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1320: 70 2d 3e 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d  p->iRow++;.  }.}
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69  .static void nti
1340: 6c 65 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20  leInverseFunc(. 
1350: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1360: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1370: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1380: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1390: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
13a0: 69 6c 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ileValueFunc(sql
13b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
13c0: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  tx){.  struct Nt
13d0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  ileCtx *p;.  p =
13e0: 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74   (struct NtileCt
13f0: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
1400: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1410: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1420: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 50    if( p && p->nP
1430: 61 72 61 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e  aram>0 ){.    in
1440: 74 20 6e 53 69 7a 65 20 3d 20 28 70 2d 3e 6e 54  t nSize = (p->nT
1450: 6f 74 61 6c 20 2f 20 70 2d 3e 6e 50 61 72 61 6d  otal / p->nParam
1460: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
1470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1480: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
1490: 34 28 70 43 74 78 2c 20 70 2d 3e 69 52 6f 77 29  4(pCtx, p->iRow)
14a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14b0: 20 20 20 69 36 34 20 6e 4c 61 72 67 65 20 3d 20     i64 nLarge = 
14c0: 70 2d 3e 6e 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e  p->nTotal - p->n
14d0: 50 61 72 61 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20  Param*nSize;.   
14e0: 20 20 20 69 36 34 20 69 53 6d 61 6c 6c 20 3d 20     i64 iSmall = 
14f0: 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29  nLarge*(nSize+1)
1500: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  ;.      i64 iRow
1510: 20 3d 20 70 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20   = p->iRow-1;.. 
1520: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4c       assert( (nL
1530: 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29 20 2b  arge*(nSize+1) +
1540: 20 28 70 2d 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72   (p->nParam-nLar
1550: 67 65 29 2a 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e  ge)*nSize)==p->n
1560: 54 6f 74 61 6c 20 29 3b 0a 0a 20 20 20 20 20 20  Total );..      
1570: 69 66 28 20 69 52 6f 77 3c 69 53 6d 61 6c 6c 20  if( iRow<iSmall 
1580: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1590: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
15a0: 70 43 74 78 2c 20 31 20 2b 20 69 52 6f 77 2f 28  pCtx, 1 + iRow/(
15b0: 6e 53 69 7a 65 2b 31 29 29 3b 0a 20 20 20 20 20  nSize+1));.     
15c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
15e0: 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 6e  nt64(pCtx, 1 + n
15f0: 4c 61 72 67 65 20 2b 20 28 69 52 6f 77 2d 69 53  Large + (iRow-iS
1600: 6d 61 6c 6c 29 2f 6e 53 69 7a 65 29 3b 0a 20 20  mall)/nSize);.  
1610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1620: 7d 0a 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61  }..struct LastVa
1630: 6c 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74  lueCtx {.  sqlit
1640: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
1650: 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a    int nVal;.};..
1660: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1670: 74 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c  tion of last_val
1680: 75 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ue()..*/.static 
1690: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53  void last_valueS
16a0: 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  tepFunc(.  sqlit
16b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
16c0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
16d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16e0: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
16f0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
1700: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
1710: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
1720: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1730: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1740: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1750: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
1760: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
1770: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
1780: 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >pVal = sqlite3_
1790: 76 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b  value_dup(apArg[
17a0: 30 5d 29 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  0]);.    p->nVal
17b0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ++;.  }.}.static
17c0: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
17d0: 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20 73  InverseFunc(.  s
17e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
17f0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1800: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1810: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1820: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
1830: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
1840: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
1850: 74 78 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  tx *)sqlite3_agg
1860: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1870: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1880: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1890: 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20   p->nVal--;.    
18a0: 69 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29  if( p->nVal==0 )
18b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18c0: 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56  value_free(p->pV
18d0: 61 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56  al);.      p->pV
18e0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  al = 0;.    }.  
18f0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1900: 6c 61 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  last_valueValueF
1910: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1920: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
1930: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
1940: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  x *p;.  p = (str
1950: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
1960: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
1970: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1980: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1990: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
19a0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
19b0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
19c0: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20  Ctx, p->pVal);. 
19d0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
19e0: 20 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c   last_valueFinal
19f0: 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  izeFunc(sqlite3_
1a00: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
1a10: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
1a20: 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ueCtx *p;.  p = 
1a30: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
1a40: 65 43 74 78 20 2a 29 73 71 6c 69 74 65 33 5f 61  eCtx *)sqlite3_a
1a50: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a60: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1a70: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  ));.  if( p && p
1a80: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
1a90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
1aa0: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
1ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
1ac0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
1ad0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20  l);.    p->pVal 
1ae0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
1af0: 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75  ic void nth_valu
1b00: 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  eStepFunc(.  sql
1b10: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1b20: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
1b30: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1b40: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74   **apArg.){.}.st
1b50: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1b60: 6c 75 65 49 6e 76 65 72 73 65 46 75 6e 63 28 0a  lueInverseFunc(.
1b70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1b80: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
1b90: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
1ba0: 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
1bb0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  .}.static void n
1bc0: 74 68 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  th_valueValueFun
1bd0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
1be0: 74 20 2a 70 43 74 78 29 7b 0a 7d 0a 0a 73 74 61  t *pCtx){.}..sta
1bf0: 74 69 63 20 76 6f 69 64 20 66 69 72 73 74 5f 76  tic void first_v
1c00: 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20  alueStepFunc(.  
1c10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1c20: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1c30: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1c40: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1c50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 72  .static void fir
1c60: 73 74 5f 76 61 6c 75 65 49 6e 76 65 72 73 65 46  st_valueInverseF
1c70: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1c80: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c90: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ca0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1cb0: 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  rg.){.}.static v
1cc0: 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 56  oid first_valueV
1cd0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1ce0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1cf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1d00: 6c 65 61 64 53 74 65 70 46 75 6e 63 28 0a 20 20  leadStepFunc(.  
1d10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1d20: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1d30: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1d40: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1d50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61  .static void lea
1d60: 64 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20  dInverseFunc(.  
1d70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1d80: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1d90: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1da0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61  .static void lea
1dc0: 64 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  dValueFunc(sqlit
1dd0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
1de0: 29 7b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  ){.}..static voi
1df0: 64 20 6c 61 67 53 74 65 70 46 75 6e 63 28 0a 20  d lagStepFunc(. 
1e00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1e10: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1e20: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1e30: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1e40: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
1e50: 67 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20  gInverseFunc(.  
1e60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e70: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1e80: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1e90: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 67  .static void lag
1eb0: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
1ec0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
1ed0: 7b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e  {.}..#define WIN
1ee0: 44 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72  DOWFUNC(name,nAr
1ef0: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
1f30: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
1f40: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
1f50: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f70: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
1f80: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
1f90: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61  Func, name ## Va
1fa0: 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20  lueFunc,        
1fb0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
1fc0: 6d 65 20 23 23 20 49 6e 76 65 72 73 65 46 75 6e  me ## InverseFun
1fd0: 63 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20  c, #name        
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
2010: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 46 28  ine WINDOWFUNCF(
2020: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
2030: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
2060: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
2070: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
2080: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
20b0: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
20c0: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
20d0: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
20e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20f0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
2100: 65 72 73 65 46 75 6e 63 2c 20 23 6e 61 6d 65 20  erseFunc, #name 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2140: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
2150: 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d 69 6e  r those built-in
2160: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2170: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
2180: 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73 2e 0a  lso aggregates..
2190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
21a0: 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 76  indowFunctions(v
21b0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 46  oid){.  static F
21c0: 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77 46 75  uncDef aWindowFu
21d0: 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 57 49  ncs[] = {.    WI
21e0: 4e 44 4f 57 46 55 4e 43 28 72 6f 77 5f 6e 75 6d  NDOWFUNC(row_num
21f0: 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ber, 0, 0),.    
2200: 57 49 4e 44 4f 57 46 55 4e 43 28 64 65 6e 73 65  WINDOWFUNC(dense
2210: 5f 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20  _rank, 0, 0),.  
2220: 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 72 61 6e    WINDOWFUNC(ran
2230: 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49  k, 0, 0),.    WI
2240: 4e 44 4f 57 46 55 4e 43 28 70 65 72 63 65 6e 74  NDOWFUNC(percent
2250: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
2260: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
2270: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
2280: 4e 43 28 63 75 6d 65 5f 64 69 73 74 2c 20 30 2c  NC(cume_dist, 0,
2290: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
22a0: 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57  DOW_SIZE),.    W
22b0: 49 4e 44 4f 57 46 55 4e 43 28 6e 74 69 6c 65 2c  INDOWFUNC(ntile,
22c0: 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   1, SQLITE_FUNC_
22d0: 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20  WINDOW_SIZE),.  
22e0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 46 28 6c 61    WINDOWFUNCF(la
22f0: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
2300: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  .    WINDOWFUNC(
2310: 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30 29  nth_value, 2, 0)
2320: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
2330: 28 66 69 72 73 74 5f 76 61 6c 75 65 2c 20 31 2c  (first_value, 1,
2340: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
2350: 55 4e 43 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  UNC(lead, 1, 0),
2360: 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64   WINDOWFUNC(lead
2370: 2c 20 32 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46  , 2, 0), WINDOWF
2380: 55 4e 43 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  UNC(lead, 3, 0),
2390: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  .    WINDOWFUNC(
23a0: 6c 61 67 2c 20 31 2c 20 30 29 2c 20 20 57 49 4e  lag, 1, 0),  WIN
23b0: 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 32 2c 20  DOWFUNC(lag, 2, 
23c0: 30 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  0),  WINDOWFUNC(
23d0: 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d 3b  lag, 3, 0),.  };
23e0: 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74  .  sqlite3Insert
23f0: 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57 69  BuiltinFuncs(aWi
2400: 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61 79  ndowFuncs, Array
2410: 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e 63  Size(aWindowFunc
2420: 73 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  s));.}..void sql
2430: 69 74 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65  ite3WindowUpdate
2440: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2450: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4c  e, .  Window *pL
2460: 69 73 74 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  ist, .  Window *
2470: 70 57 69 6e 2c 20 0a 20 20 46 75 6e 63 44 65 66  pWin, .  FuncDef
2480: 20 2a 70 46 75 6e 63 0a 29 7b 0a 20 20 69 66 28   *pFunc.){.  if(
2490: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 29 7b 0a   pWin->zName ){.
24a0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 3b 0a 20      Window *p;. 
24b0: 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
24c0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69 6e  p; p=p->pNextWin
24d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
24e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
24f0: 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d  Name, pWin->zNam
2500: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
2510: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 3d 3d     }.    if( p==
2520: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2530: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2540: 65 2c 20 22 6e 6f 20 73 75 63 68 20 77 69 6e 64  e, "no such wind
2550: 6f 77 3a 20 25 73 22 2c 20 70 57 69 6e 2d 3e 7a  ow: %s", pWin->z
2560: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
2570: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
2580: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
2590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
25a0: 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
25b0: 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20   p->pPartition, 
25c0: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f  0);.    pWin->pO
25d0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
25e0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
25f0: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
2600: 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69  rBy, 0);.    pWi
2610: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  n->pStart = sqli
2620: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
2630: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  e->db, p->pStart
2640: 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  , 0);.    pWin->
2650: 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78  pEnd = sqlite3Ex
2660: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
2670: 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20  , p->pEnd, 0);. 
2680: 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20     pWin->eStart 
2690: 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
26a0: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d   pWin->eEnd = p-
26b0: 3e 65 45 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  >eEnd;.  }.  if(
26c0: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
26d0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
26e0: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
26f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2700: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
2710: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 72  pFunc->xSFunc==r
2720: 6f 77 5f 6e 75 6d 62 65 72 53 74 65 70 46 75 6e  ow_numberStepFun
2730: 63 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75  c || pFunc->xSFu
2740: 6e 63 3d 3d 6e 74 69 6c 65 53 74 65 70 46 75 6e  nc==ntileStepFun
2750: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2760: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
2770: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a   pWin->pStart);.
2780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2790: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
27a0: 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70  ->pEnd);.      p
27b0: 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57  Win->pStart = pW
27c0: 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20  in->pEnd = 0;.  
27d0: 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20      pWin->eType 
27e0: 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20 20 20 20 20  = TK_ROWS;.     
27f0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
2800: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20  TK_UNBOUNDED;.  
2810: 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d      pWin->eEnd =
2820: 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20   TK_CURRENT;.   
2830: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e   }..    if( pFun
2840: 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e 73 65  c->xSFunc==dense
2850: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c  _rankStepFunc ||
2860: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
2870: 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20 20 20  rankStepFunc.   
2880: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75    || pFunc->xSFu
2890: 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  nc==percent_rank
28a0: 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e  StepFunc || pFun
28b0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d 65 5f  c->xSFunc==cume_
28c0: 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20 20 20  distStepFunc.   
28d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
28f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
2900: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2910: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d  Delete(db, pWin-
2920: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57  >pEnd);.      pW
2930: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69  in->pStart = pWi
2940: 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  n->pEnd = 0;.   
2950: 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d     pWin->eType =
2960: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20   TK_RANGE;.     
2970: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
2980: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20  TK_UNBOUNDED;.  
2990: 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d      pWin->eEnd =
29a0: 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20   TK_CURRENT;.   
29b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65   }.  }.}..typede
29c0: 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52  f struct WindowR
29d0: 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77  ewrite WindowRew
29e0: 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e  rite;.struct Win
29f0: 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57  dowRewrite {.  W
2a00: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 45  indow *pWin;.  E
2a10: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 7d  xprList *pSub;.}
2a20: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  ;..static int se
2a30: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
2a40: 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65 72  eSelectCb(Walker
2a50: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2a60: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 72  t *pSelect){.  r
2a70: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2a80: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
2a90: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
2aa0: 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  teExprCb(Walker 
2ab0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2ac0: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
2ad0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
2ae0: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
2af0: 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65  Rewrite;.  Parse
2b00: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
2b10: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 73  er->pParse;..  s
2b20: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b30: 20 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b   ){..    case TK
2b40: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2b50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e   if( pExpr->pWin
2b60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
2b70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
2b80: 65 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f  e{.        Windo
2b90: 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20  w *pWin;.       
2ba0: 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69   for(pWin=p->pWi
2bb0: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
2bc0: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
2bd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2be0: 70 72 2d 3e 70 57 69 6e 3d 3d 70 57 69 6e 20 29  pr->pWin==pWin )
2bf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
2c00: 78 70 72 2d 3e 70 57 69 6e 2d 3e 70 4f 77 6e 65  xpr->pWin->pOwne
2c10: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2c30: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
2c40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
2c60: 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a  Fall through.  *
2c70: 2f 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  /..    case TK_C
2c80: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45  OLUMN: {.      E
2c90: 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69  xpr *pDup = sqli
2ca0: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
2cb0: 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
2cc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20  ;.      p->pSub 
2cd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2ce0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2cf0: 70 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a  p->pSub, pDup);.
2d00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75        if( p->pSu
2d10: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  b ){.        ass
2d20: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
2d30: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
2d40: 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20  tatic)==0 );.   
2d50: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
2d60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
2d70: 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20  tatic);.        
2d80: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2d90: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
2da0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78  xpr);.        Ex
2db0: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
2dc0: 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63  pExpr, EP_Static
2dd0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
2de0: 74 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65  t(pExpr, 0, size
2df0: 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20  of(Expr));..    
2e00: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2e10: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
2e20: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
2e30: 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78  n = p->pSub->nEx
2e40: 70 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45  pr-1;.        pE
2e50: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d  xpr->iTable = p-
2e60: 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a  >pWin->iEphCsr;.
2e70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
2e80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2e90: 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d   default: /* no-
2ea0: 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  op */.      brea
2eb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2ec0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2ed0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  ..static int sel
2ee0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
2ef0: 45 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  EList(.  Parse *
2f00: 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f  pParse, .  Windo
2f10: 77 20 2a 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c  w *pWin,.  ExprL
2f20: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
2f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f40: 77 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e  write expression
2f50: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a  s in this list *
2f60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
2f70: 70 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20  pSub            
2f80: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
2f90: 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73  ub-select expres
2fa0: 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a  sion-list */.){.
2fb0: 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
2fc0: 3b 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74  ;.  WindowRewrit
2fd0: 65 20 73 52 65 77 72 69 74 65 3b 0a 20 20 69 6e  e sRewrite;.  in
2fe0: 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  t rc;..  memset(
2ff0: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
3000: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
3010: 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
3020: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
3030: 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
3040: 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
3050: 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
3060: 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
3070: 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
3080: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
3090: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
30a0: 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64  ack = selectWind
30b0: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 3b  owRewriteExprCb;
30c0: 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .  sWalker.xSele
30d0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
30e0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
30f0: 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57 61 6c  SelectCb;.  sWal
3100: 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65 20 3d  ker.u.pRewrite =
3110: 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 72   &sRewrite;..  r
3120: 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  c = sqlite3WalkE
3130: 78 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72  xprList(&sWalker
3140: 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20 20 2a 70  , pEList);..  *p
3150: 70 53 75 62 20 3d 20 73 52 65 77 72 69 74 65 2e  pSub = sRewrite.
3160: 70 53 75 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pSub;.  return r
3170: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 45 78 70  c;.}..static Exp
3180: 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41  rList *exprListA
3190: 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72  ppendList(.  Par
31a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
31b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
31c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
31d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
31e0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
31f0: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
3200: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
3210: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
3220: 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c  ppend       /* L
3230: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ist of values to
3240: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
3250: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
3260: 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20  f( pAppend ){.  
3270: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
3280: 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f   nInit = pList ?
3290: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
32a0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
32b0: 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72  i<pAppend->nExpr
32c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
32d0: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
32e0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
32f0: 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61  ->db, pAppend->a
3300: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [i].pExpr, 0);. 
3310: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
3320: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
3330: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
3340: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
3350: 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74  f( pList ) pList
3360: 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72  ->a[nInit+i].sor
3370: 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64  tOrder = pAppend
3380: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
3390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
33a0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
33b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
33c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
33d0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
33e0: 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  d argument does 
33f0: 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e  not invoke.** an
3400: 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e  y SQL window fun
3410: 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e  ctions, this fun
3420: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
3430: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
3440: 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65  .** rewrites the
3450: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3460: 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77  t so that window
3470: 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20   function xStep 
3480: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
3490: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
34a0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 54  correct order. T
34b0: 68 65 20 73 69 6d 70 6c 65 73 74 20 76 65 72 73  he simplest vers
34c0: 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74  ion of the .** t
34d0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
34e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
34f0: 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29 20 4f 56   win(args...) OV
3500: 45 52 20 28 3c 6c 69 73 74 31 3e 29 20 46 52 4f  ER (<list1>) FRO
3510: 4d 20 3c 73 72 63 3e 20 4f 52 44 45 52 20 42 59  M <src> ORDER BY
3520: 20 3c 6c 69 73 74 32 3e 0a 2a 2a 0a 2a 2a 20 74   <list2>.**.** t
3530: 6f 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  o.**.**   SELECT
3540: 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29 20 46 52   win(args...) FR
3550: 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 53 45 4c 45  OM (.**     SELE
3560: 43 54 20 61 72 67 73 2e 2e 2e 20 46 52 4f 4d 20  CT args... FROM 
3570: 3c 73 72 63 3e 20 4f 52 44 45 52 20 42 59 20 3c  <src> ORDER BY <
3580: 6c 69 73 74 31 3e 0a 2a 2a 20 20 20 29 20 4f 52  list1>.**   ) OR
3590: 44 45 52 20 42 59 20 3c 6c 69 73 74 32 3e 0a 2a  DER BY <list2>.*
35a0: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 73 72 63 3e  *.** where <src>
35b0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
35c0: 52 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64  RE, GROUP BY and
35d0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2c   HAVING clauses,
35e0: 20 61 6e 64 20 3c 6c 69 73 74 31 3e 0a 2a 2a 20   and <list1>.** 
35f0: 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
3600: 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 41 52 54  tion of the PART
3610: 49 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44  ITION BY and ORD
3620: 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 69 6e  ER BY clauses in
3630: 20 74 68 65 0a 2a 2a 20 4f 56 45 52 20 63 6c 61   the.** OVER cla
3640: 75 73 65 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  use..**.*/.int s
3650: 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77 72  qlite3WindowRewr
3660: 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
3670: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
3680: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3690: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57  _OK;.  if( p->pW
36a0: 69 6e 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  in ){.    Vdbe *
36b0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
36c0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
36d0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
36e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
36f0: 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  >db;.    Select 
3700: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
3710: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
3720: 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72  bquery */.    Sr
3730: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
3740: 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20  >pSrc;.    Expr 
3750: 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68  *pWhere = p->pWh
3760: 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ere;.    ExprLis
3770: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  t *pGroupBy = p-
3780: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45  >pGroupBy;.    E
3790: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70  xpr *pHaving = p
37a0: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45  ->pHaving;.    E
37b0: 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d  xprList *pSort =
37c0: 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73   0;..    ExprLis
37d0: 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b  t *pSublist = 0;
37e0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
37f0: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75  sion list for su
3800: 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57  b-query */.    W
3810: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
3820: 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20  ->pWin;      /* 
3830: 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62  Master window ob
3840: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64  ject */.    Wind
3850: 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20  ow *pWin;       
3860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
3870: 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61  dow object itera
3880: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70  tor */..    p->p
3890: 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
38a0: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
38b0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  p->pGroupBy = 0;
38c0: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
38d0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73  = 0;..    /* Ass
38e0: 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  ign a cursor num
38f0: 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65  ber for the ephe
3900: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
3910: 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e   to buffer rows.
3920: 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e  .    ** The Open
3930: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
3940: 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c  ction is coded l
3950: 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69  ater, after it i
3960: 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20  s known how.    
3970: 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  ** many columns 
3980: 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68  the table will h
3990: 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57  ave.  */.    pMW
39a0: 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50  in->iEphCsr = pP
39b0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20  arse->nTab++;.. 
39c0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 57 69     rc = selectWi
39d0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
39e0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
39f0: 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75 62  p->pEList, &pSub
3a00: 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  list);.    if( r
3a10: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
3a20: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 57 69     rc = selectWi
3a30: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
3a40: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
3a50: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53  p->pOrderBy, &pS
3a60: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  ublist);.    if(
3a70: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
3a80: 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  .    pMWin->nBuf
3a90: 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69  ferCol = (pSubli
3aa0: 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e  st ? pSublist->n
3ab0: 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20  Expr : 0);..    
3ac0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f 52  /* Create the OR
3ad0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
3ae0: 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  r the sub-select
3af0: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f  . This is the co
3b00: 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20 20  ncatenation.    
3b10: 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77  ** of the window
3b20: 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f   PARTITION and O
3b30: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
3b40: 20 41 70 70 65 6e 64 20 74 68 65 20 73 61 6d 65   Append the same
3b50: 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73   .    ** express
3b60: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 75 62 2d  ions to the sub-
3b70: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
3b80: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
3b90: 20 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20 20   required to.   
3ba0: 20 2a 2a 20 66 69 67 75 72 65 20 6f 75 74 20 77   ** figure out w
3bb0: 68 65 72 65 20 62 6f 75 6e 64 61 72 69 65 73 20  here boundaries 
3bc0: 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20 61  for partitions a
3bd0: 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72 20  nd sets of peer 
3be0: 72 6f 77 73 2e 20 20 2a 2f 0a 20 20 20 20 70 53  rows.  */.    pS
3bf0: 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ort = sqlite3Exp
3c00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 57  rListDup(db, pMW
3c10: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  in->pPartition, 
3c20: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
3c30: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  n->pOrderBy ){. 
3c40: 20 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70       pSort = exp
3c50: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
3c60: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
3c70: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b  MWin->pOrderBy);
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 6c  .    }.    pSubl
3c90: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
3ca0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
3cb0: 20 70 53 75 62 6c 69 73 74 2c 20 70 53 6f 72 74   pSublist, pSort
3cc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
3cd0: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
3ce0: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77  passed to each w
3cf0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
3d00: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62  o the.    ** sub
3d10: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
3d20: 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c  on list. Also al
3d30: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
3d40: 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20  ters for each.  
3d50: 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
3d60: 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74  tion - one for t
3d70: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20  he accumulator, 
3d80: 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65  another for inte
3d90: 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  rim.    ** resul
3da0: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ts.  */.    for(
3db0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
3dc0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
3dd0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57  xtWin){.      pW
3de0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70  in->iArgCol = (p
3df0: 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69  Sublist ? pSubli
3e00: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
3e10: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
3e20: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
3e30: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
3e40: 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  list, pWin->pOwn
3e50: 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  er->x.pList);.  
3e60: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
3e70: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
3e80: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
3e90: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
3ea0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
3eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ec0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
3ed0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
3ee0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
3ef0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65  pSub = sqlite3Se
3f00: 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20  lectNew(.       
3f10: 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73   pParse, pSublis
3f20: 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c  t, pSrc, pWhere,
3f30: 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69   pGroupBy, pHavi
3f40: 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a  ng, pSort, 0, 0.
3f50: 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53      );.    p->pS
3f60: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
3f70: 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
3f80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
3f90: 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20  p->pSrc ){.     
3fa0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 20   int iTab;.     
3fb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
3fc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
3fd0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
3fe0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
3ff0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
4000: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
4010: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
4020: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
4030: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
4040: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
4050: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
4060: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4070: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
4080: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
4090: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
40a0: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 7d 0a  panded;.      }.
40b0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
40c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
40d0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
40e0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
40f0: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
4100: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
4110: 6e 20 72 63 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  n rc;.}..void sq
4120: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
4130: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
4140: 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28  indow *p){.  if(
4150: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
4160: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4170: 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20  p->pFilter);.   
4180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4190: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
41a0: 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73  artition);.    s
41b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
41c0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
41d0: 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
41e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
41f0: 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73   p->pEnd);.    s
4200: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4210: 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b  (db, p->pStart);
4220: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4230: 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ee(db, p->zName)
4240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
4250: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
4260: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  }..void sqlite3W
4270: 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28  indowListDelete(
4280: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e  sqlite3 *db, Win
4290: 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  dow *p){.  while
42a0: 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f  ( p ){.    Windo
42b0: 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  w *pNext = p->pN
42c0: 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69  extWin;.    sqli
42d0: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
42e0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20  db, p);.    p = 
42f0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 57 69  pNext;.  }.}..Wi
4300: 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
4310: 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73  dowAlloc(.  Pars
4320: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e  e *pParse, .  in
4330: 74 20 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 65  t eType,.  int e
4340: 53 74 61 72 74 2c 20 45 78 70 72 20 2a 70 53 74  Start, Expr *pSt
4350: 61 72 74 2c 0a 20 20 69 6e 74 20 65 45 6e 64 2c  art,.  int eEnd,
4360: 20 45 78 70 72 20 2a 70 45 6e 64 0a 29 7b 0a 20   Expr *pEnd.){. 
4370: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20   Window *pWin = 
4380: 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33  (Window*)sqlite3
4390: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
43a0: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
43b0: 57 69 6e 64 6f 77 29 29 3b 0a 0a 20 20 69 66 28  Window));..  if(
43c0: 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69   pWin ){.    pWi
43d0: 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65  n->eType = eType
43e0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61  ;.    pWin->eSta
43f0: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 20  rt = eStart;.   
4400: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45   pWin->eEnd = eE
4410: 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  nd;.    pWin->pE
4420: 6e 64 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 70  nd = pEnd;.    p
4430: 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 53  Win->pStart = pS
4440: 74 61 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tart;.  }else{. 
4450: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4460: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
4470: 20 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69   pEnd);.    sqli
4480: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
4490: 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74  arse->db, pStart
44a0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
44b0: 20 70 57 69 6e 3b 0a 7d 0a 0a 76 6f 69 64 20 73   pWin;.}..void s
44c0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
44d0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
44e0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
44f0: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
4500: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 6e  p ){.    p->pWin
4510: 20 3d 20 70 57 69 6e 3b 0a 20 20 7d 65 6c 73 65   = pWin;.  }else
4520: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
4530: 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65  dowDelete(pParse
4540: 2d 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d  ->db, pWin);.  }
4550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4560: 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 77 69   0 if the two wi
4570: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72 65  ndow objects are
4580: 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e   identical, or n
4590: 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73  on-zero otherwis
45a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
45b0: 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50  3WindowCompare(P
45c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
45d0: 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77  ndow *p1, Window
45e0: 20 2a 70 32 29 7b 0a 20 20 69 66 28 20 70 31 2d   *p2){.  if( p1-
45f0: 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65 54 79 70  >eType!=p2->eTyp
4600: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
4610: 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d  if( p1->eStart!=
4620: 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74  p2->eStart ) ret
4630: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
4640: 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20  >eEnd!=p2->eEnd 
4650: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
4660: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
4670: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d  pare(pParse, p1-
4680: 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74  >pStart, p2->pSt
4690: 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72  art, -1) ) retur
46a0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
46b0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
46c0: 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20  arse, p1->pEnd, 
46d0: 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20  p2->pEnd, -1) ) 
46e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
46f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
4700: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74  ompare(p1->pPart
4710: 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74  ition, p2->pPart
4720: 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74  ition, -1) ) ret
4730: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
4740: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
4750: 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79  are(p1->pOrderBy
4760: 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20  , p2->pOrderBy, 
4770: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
4780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
4790: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
47a0: 77 41 67 67 49 6e 69 74 28 50 61 72 73 65 20 2a  wAggInit(Parse *
47b0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
47c0: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
47d0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
47e0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
47f0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
4800: 57 69 6e 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  Win){.    Vdbe *
4810: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4820: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
4830: 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69  FuncDef *p = pWi
4840: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66  n->pFunc;.    if
4850: 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  ( (p->funcFlags 
4860: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
4870: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65  NMAX) && pWin->e
4880: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
4890: 44 45 44 20 29 7b 0a 20 20 20 20 20 20 45 78 70  DED ){.      Exp
48a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
48b0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
48c0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49  List;.      KeyI
48d0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
48e0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
48f0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4900: 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  e, pList, 0, 0);
4910: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
4920: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
4930: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e  ab++;.      pWin
4940: 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73  ->regApp = pPars
4950: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
4960: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
4970: 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   3;.      if( pK
4980: 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e  eyInfo && pWin->
4990: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d  pFunc->zName[1]=
49a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='i' ){.        
49b0: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
49c0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d  ->aSortOrder[0]=
49d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  =0 );.        pK
49e0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
49f0: 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20  er[0] = 1;.     
4a00: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
4a10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4a20: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
4a30: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29  pWin->csrApp, 2)
4a40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4a50: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
4a60: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
4a70: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NFO);.      sqli
4a80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4a90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
4aa0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b  pWin->regApp+1);
4ab0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
4ac0: 69 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6e  if( p->xSFunc==n
4ad0: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
4ae0: 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 66   || p->xSFunc==f
4af0: 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75  irst_valueStepFu
4b00: 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nc ){.      /* A
4b10: 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69  llocate two regi
4b20: 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72  sters at pWin->r
4b30: 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c  egApp. These wil
4b40: 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20  l be used to.   
4b50: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
4b60: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e  start and end in
4b70: 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65  dex of the curre
4b80: 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20  nt frame.  */.  
4b90: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
4ba0: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
4bb0: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
4bc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
4bd0: 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  1;.      pWin->c
4be0: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
4bf0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nTab++;.      pP
4c00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
4c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4c20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
4c30: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
4c40: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
4c50: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hCsr);.    }.   
4c60: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 53 46   else if( p->xSF
4c70: 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e  unc==leadStepFun
4c80: 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d  c || p->xSFunc==
4c90: 6c 61 67 53 74 65 70 46 75 6e 63 20 29 7b 0a 20  lagStepFunc ){. 
4ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
4cb0: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
4cc0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
4cd0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
4ce0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
4cf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4d00: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
4d10: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
4d20: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
4d30: 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69    }.}..void sqli
4d40: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69  te3WindowCodeIni
4d50: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4d60: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
4d70: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
4d80: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
4d90: 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20  e);.  int nPart 
4da0: 3d 20 28 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  = (pWin->pPartit
4db0: 69 6f 6e 20 3f 20 70 57 69 6e 2d 3e 70 50 61 72  ion ? pWin->pPar
4dc0: 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20  tition->nExpr : 
4dd0: 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28  0);.  nPart += (
4de0: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f  pWin->pOrderBy ?
4df0: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d   pWin->pOrderBy-
4e00: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69  >nExpr : 0);.  i
4e10: 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20  f( nPart ){.    
4e20: 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20  pWin->regPart = 
4e30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4e40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
4e50: 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73   += nPart;.    s
4e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e70: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
4e80: 70 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70  pWin->regPart, p
4e90: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61  Win->regPart+nPa
4ea0: 72 74 2d 31 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  rt-1);.  }.  win
4eb0: 64 6f 77 41 67 67 49 6e 69 74 28 70 50 61 72 73  dowAggInit(pPars
4ec0: 65 2c 20 70 57 69 6e 29 3b 0a 7d 0a 0a 73 74 61  e, pWin);.}..sta
4ed0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
4ee0: 68 65 63 6b 46 72 61 6d 65 56 61 6c 75 65 28 50  heckFrameValue(P
4ef0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4f00: 74 20 72 65 67 2c 20 69 6e 74 20 62 45 6e 64 29  t reg, int bEnd)
4f10: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
4f20: 20 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d   char *azErr[] =
4f30: 20 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74   {.    "frame st
4f40: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
4f50: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
4f60: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20  tive integer",. 
4f70: 20 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67     "frame ending
4f80: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
4f90: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
4fa0: 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 56  nteger".  };.  V
4fb0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4fc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
4fd0: 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d  .  int regZero =
4fe0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4ff0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
5000: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5010: 67 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29  ger, 0, regZero)
5020: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5030: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
5040: 42 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69  BeInt, reg, sqli
5050: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5060: 64 72 28 76 29 2b 32 29 3b 0a 20 20 73 71 6c 69  dr(v)+2);.  sqli
5070: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5080: 20 4f 50 5f 47 65 2c 20 72 65 67 5a 65 72 6f 2c   OP_Ge, regZero,
5090: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
50a0: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65  entAddr(v)+2, re
50b0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  g);.  sqlite3Vdb
50c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61  eAddOp2(v, OP_Ha
50d0: 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  lt, SQLITE_ERROR
50e0: 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73  , OE_Abort);.  s
50f0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
5100: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45  P4(v, (void*)azE
5110: 72 72 5b 62 45 6e 64 5d 2c 20 50 34 5f 53 54 41  rr[bEnd], P4_STA
5120: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  TIC);.}../*.** G
5130: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
5140: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
5150: 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e   xStep() (if bIn
5160: 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a  verse is 0) or .
5170: 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20  ** xInverse (if 
5180: 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d  bInverse is non-
5190: 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77  zero) for each w
51a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
51b0: 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
51c0: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
51d0: 74 20 70 4d 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74  t pMWin..*/.stat
51e0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
51f0: 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  gStep(.  Parse *
5200: 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f  pParse, .  Windo
5210: 77 20 2a 70 4d 57 69 6e 2c 20 0a 20 20 69 6e 74  w *pMWin, .  int
5220: 20 63 73 72 2c 0a 20 20 69 6e 74 20 62 49 6e 76   csr,.  int bInv
5230: 65 72 73 65 2c 20 0a 20 20 69 6e 74 20 72 65 67  erse, .  int reg
5240: 2c 0a 20 20 69 6e 74 20 72 65 67 50 61 72 74 53  ,.  int regPartS
5250: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
5260: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5270: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20  containing size 
5280: 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  of partition */.
5290: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
52a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
52b0: 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20  arse);.  Window 
52c0: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
52d0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
52e0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
52f0: 69 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  in){.    int fla
5300: 67 73 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  gs = pWin->pFunc
5310: 2d 3e 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20  ->funcFlags;.   
5320: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20   int regArg;.   
5330: 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e   int nArg = pWin
5340: 2d 3e 6e 41 72 67 3b 0a 0a 20 20 20 20 69 66 28  ->nArg;..    if(
5350: 20 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20   csr>=0 ){.     
5360: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5370: 72 28 69 3d 30 3b 20 69 3c 70 57 69 6e 2d 3e 6e  r(i=0; i<pWin->n
5380: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
5390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
53a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
53b0: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
53c0: 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b  rgCol+i, reg+i);
53d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
53e0: 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20  egArg = reg;.   
53f0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
5400: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
5410: 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  W_SIZE ){.      
5420: 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
5430: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 41 72  .          regAr
5440: 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65 3b  g = regPartSize;
5450: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5460: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5470: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5480: 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72 74  P_SCopy, regPart
5490: 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b  Size, reg+nArg);
54a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
54b0: 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20     nArg++;.     
54c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
54d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c      assert( !(fl
54e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
54f0: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29  C_WINDOW_SIZE) )
5500: 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d  ;.      regArg =
5510: 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72   reg + pWin->iAr
5520: 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gCol;.    }..   
5530: 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e   if( (pWin->pFun
5540: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
5550: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
5560: 58 29 20 0a 20 20 20 20 20 20 26 26 20 70 57 69  X) .      && pWi
5570: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
5580: 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a  BOUNDED .    ){.
5590: 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72        if( bInver
55a0: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
55b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
55c0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
55d0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
55e0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
55f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5600: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41  , OP_SCopy, regA
5610: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rg, pWin->regApp
5620: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5630: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5640: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
5650: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20  Win->regApp, 2, 
5660: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
5670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5680: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5690: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e  _IdxInsert, pWin
56a0: 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e  ->csrApp, pWin->
56b0: 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20  regApp+2);.     
56c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
56d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56e0: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
56f0: 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  E, pWin->csrApp,
5700: 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a   0, regArg, 1);.
5710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5720: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5730: 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73  Delete, pWin->cs
5740: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  rApp);.        s
5750: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5760: 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  re(v, sqlite3Vdb
5770: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
5780: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5790: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
57a0: 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20  regApp ){.      
57b0: 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 46  assert( pWin->pF
57c0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
57d0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
57e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
57f0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
5800: 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74  c==first_valueSt
5810: 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20 29 3b  epFunc .      );
5820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
5830: 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49  Inverse==0 || bI
5840: 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20  nverse==1 );.   
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5860: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
5870: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  m, pWin->regApp+
5880: 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a  1-bInverse, 1);.
5890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
58a0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
58b0: 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20  c==leadStepFunc 
58c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
58d0: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75  Win->pFunc->xSFu
58e0: 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 20  nc==lagStepFunc 
58f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
5900: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
5910: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
5920: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
5930: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
5940: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
5950: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5960: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
5970: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5980: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5990: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
59a0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
59b0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
59c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
59d0: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
59e0: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
59f0: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
5a00: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a20: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
5a30: 67 53 74 65 70 30 2c 20 62 49 6e 76 65 72 73 65  gStep0, bInverse
5a40: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
5a50: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
5a60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
5a70: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
5a80: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
5a90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5aa0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
5ab0: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 7d 0a  u8)nArg);.    }.
5ac0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
5ad0: 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  id windowAggFina
5ae0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
5af0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
5b00: 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20 56  int bFinal){.  V
5b10: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
5b20: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5b30: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
5b40: 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ..  for(pWin=pMW
5b50: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
5b60: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
5b70: 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70      if( (pWin->p
5b80: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
5b90: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
5ba0: 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20 70  NMAX) .     && p
5bb0: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
5bc0: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29  UNBOUNDED .    )
5bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5be0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5bf0: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
5c00: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5c10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c20: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
5c30: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
5c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5c50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
5c60: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
5c70: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
5c80: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
5c90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5ca0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
5cb0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
5cc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  ;.      if( bFin
5cd0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
5ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5cf0: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
5d00: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
5d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5d20: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65  lse if( pWin->re
5d30: 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73  gApp ){.    }els
5d40: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  e{.      if( bFi
5d50: 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
5d60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d70: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
5d80: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
5d90: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
5da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5db0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
5dc0: 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  nal, pWin->regAc
5dd0: 63 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29  cum, pWin->nArg)
5de0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5df0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
5e00: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
5e10: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 69  UNCDEF);.      i
5e20: 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20  f( bFinal ){.   
5e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
5e50: 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  y, pWin->regAccu
5e60: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  m, pWin->regResu
5e70: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
5e80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5e90: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
5ea0: 20 2d 31 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65   -1, pWin->regRe
5eb0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
5ec0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
5ed0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61  ic void windowPa
5ee0: 72 74 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20  rtitionCache(.  
5ef0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
5f00: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
5f10: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
5f20: 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50  .  int regFlushP
5f30: 61 72 74 2c 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  art,.  int lblFl
5f40: 75 73 68 50 61 72 74 2c 0a 20 20 69 6e 74 20 2a  ushPart,.  int *
5f50: 70 52 65 67 53 69 7a 65 0a 29 7b 0a 20 20 57 69  pRegSize.){.  Wi
5f60: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
5f70: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
5f80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
5f90: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
5fa0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74  dow *pWin;.  int
5fb0: 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53   iSubCsr = p->pS
5fc0: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
5fd0: 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70  ;.  int nSub = p
5fe0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
5ff0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b  b->nCol;.  int k
6000: 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70  ;..  int reg = p
6010: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6020: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
6030: 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74   reg+nSub;.  int
6040: 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52   regRowid = regR
6050: 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65  ecord+1;..  *pRe
6060: 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64  gSize = regRowid
6070: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
6080: 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20   += nSub + 2;.. 
6090: 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20   /* Martial the 
60a0: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
60b0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69  the sub-select i
60c0: 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
60d0: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e  .  ** registers.
60e0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
60f0: 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nSub; k++){.   
6100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6110: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
6120: 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67   iSubCsr, k, reg
6130: 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  +k);.  }.  sqlit
6140: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6150: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6160: 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63  eg, nSub, regRec
6170: 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ord);..  /* Chec
6180: 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  k if this is the
6190: 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
61a0: 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f  partition. If so
61b0: 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
61c0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20  flush_partition 
61d0: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f  sub-routine.  */
61e0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
61f0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
6200: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
6210: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
6220: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
6230: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
6240: 20 3d 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   = (pPart ? pPar
6250: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
6260: 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72     int regNewPar
6270: 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d  t = reg + pMWin-
6280: 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20  >nBufferCol;.   
6290: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
62a0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
62b0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
62c0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30  pParse, pPart, 0
62d0: 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72 20  , 0);..    addr 
62e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
62f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
6300: 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  e, regNewPart, p
6310: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50  MWin->regPart,nP
6320: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
6330: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
6340: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
6350: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
6360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6370: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
6380: 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c   addr+2, addr+4,
6390: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 73 71   addr+2);.    sq
63a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
63b0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
63c0: 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72  ewPart, pMWin->r
63d0: 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29  egPart, nPart-1)
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6400: 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
6410: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29  t, lblFlushPart)
6420: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66  ;.  }..  /* Buff
6430: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  er the current r
6440: 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65  ow in the epheme
6450: 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ral table. */.  
6460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6470: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
6480: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
6490: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
64a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
64b0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
64c0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
64d0: 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
64e0: 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f  id);..  /* End o
64f0: 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
6500: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
6510: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
6520: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75    /* Invoke "flu
6530: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 74 6f  sh_partition" to
6540: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 66   deal with the f
6550: 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70  inal (or only) p
6560: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  artition */.  sq
6570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6580: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
6590: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
65a0: 75 73 68 50 61 72 74 29 3b 0a 7d 0a 0a 73 74 61  ushPart);.}..sta
65b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52  tic void windowR
65c0: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50  eturnOneRow(.  P
65d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
65e0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20  Window *pMWin,. 
65f0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20   int regGosub,. 
6600: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
6610: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
6620: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6630: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
6640: 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e  pWin;.  for(pWin
6650: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
6660: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
6670: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
6680: 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
6690: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46  Func;.    if( pF
66a0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
66b0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
66c0: 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78       || pFunc->x
66d0: 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c  SFunc==first_val
66e0: 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20  ueStepFunc .    
66f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72  ){.      int csr
6700: 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b   = pWin->csrApp;
6710: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d  .      int lbl =
6720: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6730: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
6740: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
6750: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6760: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6780: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
6790: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
67a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ..      if( pFun
67b0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  c->xSFunc==nth_v
67c0: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a  alueStepFunc ){.
67d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
67e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
67f0: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 69 45  Column, pWin->iE
6800: 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  phCsr, pWin->iAr
6810: 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 29 3b  gCol+1, tmpReg);
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6840: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6850: 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67  teger, 1, tmpReg
6860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6880: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d  p3(v, OP_Add, tm
6890: 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  pReg, pWin->regA
68a0: 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  pp, tmpReg);.   
68b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
68c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70  dOp3(v, OP_Gt, p
68d0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c  Win->regApp+1, l
68e0: 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  bl, tmpReg);.   
68f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6900: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
6910: 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20  owid, csr, lbl, 
6920: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73  tmpReg);.      s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6940: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
6950: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
6960: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
6970: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
6980: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6990: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
69a0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
69b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
69c0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
69d0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e     else if( pFun
69e0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
69f0: 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63  tepFunc || pFunc
6a00: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65  ->xSFunc==lagSte
6a10: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  pFunc ){.      i
6a20: 6e 74 20 69 45 70 68 20 3d 20 70 57 69 6e 2d 3e  nt iEph = pWin->
6a30: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69  iEphCsr;.      i
6a40: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
6a50: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
6a60: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
6a70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
6a80: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
6a90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6aa0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
6ab0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 6e       if( pWin->n
6ac0: 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Arg<3 ){.       
6ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ae0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
6af0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
6b00: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
6b10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6b20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6b30: 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70  _Column, iEph, p
6b40: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20  Win->iArgCol+2, 
6b50: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
6b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b80: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
6b90: 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  Eph, tmpReg);.  
6ba0: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 6e 41      if( pWin->nA
6bb0: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
6bc0: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
6bd0: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
6be0: 65 70 46 75 6e 63 20 3f 20 31 20 3a 20 2d 31 29  epFunc ? 1 : -1)
6bf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6c00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6c10: 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67  P_AddImm, tmpReg
6c20: 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d 65  , val);.      }e
6c30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
6c40: 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 78 53   op = (pFunc->xS
6c50: 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75  Func==leadStepFu
6c60: 6e 63 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50  nc ? OP_Add : OP
6c70: 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20  _Subtract);.    
6c80: 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20      int tmpReg2 
6c90: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6ca0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
6cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6cc0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6cd0: 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d  umn, iEph, pWin-
6ce0: 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52  >iArgCol+1, tmpR
6cf0: 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eg2);.        sq
6d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6d10: 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20  v, op, tmpReg2, 
6d20: 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b  tmpReg, tmpReg);
6d30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6d40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6d50: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b  Parse, tmpReg2);
6d60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d80: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
6d90: 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70  d, csr, lbl, tmp
6da0: 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
6db0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6dc0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
6dd0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20   pWin->iArgCol, 
6de0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
6df0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6e00: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6e10: 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73  v, lbl);.      s
6e20: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6e30: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
6e40: 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Reg);.    }.  }.
6e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e60: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
6e70: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
6e80: 6f 73 75 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  osub);.}..static
6e90: 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75   void windowRetu
6ea0: 72 6e 52 6f 77 73 28 0a 20 20 50 61 72 73 65 20  rnRows(.  Parse 
6eb0: 2a 70 50 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f  *pParse,.  Windo
6ec0: 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69 6e 74 20  w *pMWin,.  int 
6ed0: 72 65 67 43 74 72 2c 0a 20 20 69 6e 74 20 62 46  regCtr,.  int bF
6ee0: 69 6e 61 6c 2c 0a 20 20 69 6e 74 20 72 65 67 47  inal,.  int regG
6ef0: 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72  osub,.  int addr
6f00: 47 6f 73 75 62 2c 0a 20 20 69 6e 74 20 72 65 67  Gosub,.  int reg
6f10: 49 6e 76 41 72 67 2c 0a 20 20 69 6e 74 20 72 65  InvArg,.  int re
6f20: 67 49 6e 76 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  gInvSize.){.  in
6f30: 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a  t addr;.  Vdbe *
6f40: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6f50: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 77 69  be(pParse);.  wi
6f60: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
6f70: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a  rse, pMWin, 0);.
6f80: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
6f90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6fa0: 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72 2c 20  _IfPos, regCtr, 
6fb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6fc0: 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31 29 3b  ntAddr(v)+2 ,1);
6fd0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6fe0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
6ff0: 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77   0, 0);.  window
7000: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
7010: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
7020: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
7030: 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76 41 72  ;.  if( regInvAr
7040: 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41  g ){.    windowA
7050: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
7060: 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  MWin, pMWin->iEp
7070: 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e 76 41  hCsr, 1, regInvA
7080: 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65 29 3b  rg, regInvSize);
7090: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
70a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
70b0: 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ext, pMWin->iEph
70c0: 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Csr, addr);.  sq
70d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
70e0: 65 28 76 2c 20 61 64 64 72 2b 31 29 3b 20 20 20  e(v, addr+1);   
70f0: 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f 20 2a  /* The OP_Goto *
7100: 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  /.}..static int 
7110: 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28  windowInitAccum(
7120: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
7130: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
7140: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
7150: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7160: 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  );.  int regArg;
7170: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
7180: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
7190: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
71a0: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
71b0: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
71c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
71d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
71e0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
71f0: 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20  um);.    nArg = 
7200: 4d 41 58 28 6e 41 72 67 2c 20 70 57 69 6e 2d 3e  MAX(nArg, pWin->
7210: 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 70  nArg);.    if( p
7220: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75  Win->pFunc->xSFu
7230: 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65  nc==nth_valueSte
7240: 70 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20 70 57  pFunc.     || pW
7250: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
7260: 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74  c==first_valueSt
7270: 65 70 46 75 6e 63 20 0a 20 20 20 20 29 7b 0a 20  epFunc .    ){. 
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7290: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
72a0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
72b0: 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71  egApp);.      sq
72c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
72d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
72e0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
72f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
7300: 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e  egArg = pParse->
7310: 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
7320: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a  ->nMem += nArg;.
7330: 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67 3b    return regArg;
7340: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 4f 57 53 20  .}.../*.** ROWS 
7350: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
7360: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
7370: 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
7380: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73b0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 73  -------.**.** Ps
73c0: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 74 68  eudo-code for th
73d0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
73e0: 20 6f 66 20 74 68 69 73 20 77 69 6e 64 6f 77 20   of this window 
73f0: 66 72 61 6d 65 20 74 79 70 65 20 69 73 20 61 73  frame type is as
7400: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 73 71 6c  .** follows. sql
7410: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
7420: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7430: 6e 20 63 61 6c 6c 65 64 20 74 6f 20 67 65 6e 65  n called to gene
7440: 72 61 74 65 20 74 68 65 0a 2a 2a 20 74 6f 70 20  rate the.** top 
7450: 6f 66 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70  of the main loop
7460: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
7470: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
7480: 2a 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 74  *.** Each time t
7490: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61  he sub-routine a
74a0: 74 20 61 64 64 72 47 6f 73 75 62 20 69 73 20 69  t addrGosub is i
74b0: 6e 76 6f 6b 65 64 2c 20 61 20 73 69 6e 67 6c 65  nvoked, a single
74c0: 20 6f 75 74 70 75 74 0a 2a 2a 20 72 6f 77 20 69   output.** row i
74d0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
74e0: 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
74f0: 20 72 6f 77 20 69 6e 64 69 63 61 74 65 64 20 62   row indicated b
7500: 79 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  y Window.iEphCsr
7510: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a  ..**.**     ....
7520: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
7530: 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
7540: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66           Gosub f
7550: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a  lush_partition.*
7560: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
7570: 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72     Insert (recor
7580: 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a  d in eph-table).
7590: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  **     sqlite3Wh
75a0: 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
75b0: 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74  Gosub flush_part
75c0: 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20  ition.**  .**   
75d0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a  flush_partition:
75e0: 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a  .**     Once {.*
75f0: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
7600: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53  (iEphCsr -> csrS
7610: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f  tart).**       O
7620: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
7630: 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  -> csrEnd).**   
7640: 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74    }.**     regSt
7650: 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20  art = <expr1>   
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
7670: 50 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73  PRECEDING expres
7680: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45  sion.**     regE
7690: 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20  nd = <expr2>    
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
76b0: 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65   FOLLOWING expre
76c0: 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28  ssion.**     if(
76d0: 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72   regStart<0 || r
76e0: 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72  egEnd<0 ){ error
76f0: 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e  ! }.**     Rewin
7700: 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c  d (csr,csrStart,
7710: 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20  csrEnd)      // 
7720: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
7730: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
7740: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63  .**       Next(c
7750: 73 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20  srEnd)          
7760: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
7770: 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74 65 70  EOF skip Aggstep
7780: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65  .**       Aggste
7790: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
77a0: 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
77b0: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
77c0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
77d0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
77e0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
77f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
7800: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
7810: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
7820: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
7830: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
7840: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
7850: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
7860: 20 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20          AggStep 
7870: 28 63 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65  (csrStart, xInve
7880: 72 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  rse).**         
7890: 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
78a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
78b0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c         }.**   fl
78c0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
78d0: 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74  ne:.**     Reset
78e0: 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20  Sorter (csr).** 
78f0: 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a      Return.**.**
7900: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
7910: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20  xpr> PRECEDING  
7920: 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f    AND CURRENT RO
7930: 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  W.** ROWS BETWEE
7940: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
7950: 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e        AND <expr>
7960: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f   FOLLOWING.** RO
7970: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
7980: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
7990: 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  ND <expr> FOLLOW
79a0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ING.**.**   Thes
79b0: 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  e are similar to
79c0: 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20   the above. For 
79d0: 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69  "CURRENT ROW", i
79e0: 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20  ntialize the.** 
79f0: 20 20 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e    register to 0.
7a00: 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20   For "UNBOUNDED 
7a10: 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e  PRECEDING" to in
7a20: 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f  finity..**.** RO
7a30: 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
7a40: 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41  > PRECEDING    A
7a50: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
7a60: 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42  LOWING.** ROWS B
7a70: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
7a80: 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 55  OW         AND U
7a90: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
7aa0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77  NG.**.**     Rew
7ab0: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
7ac0: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20  t,csrEnd)    // 
7ad0: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
7ae0: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
7af0: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
7b00: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78   ){.**       Nex
7b10: 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20  t(csrEnd)       
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78             // Ex
7b30: 69 74 20 77 68 69 6c 65 28 31 29 20 61 74 20 45  it while(1) at E
7b40: 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  OF.**       Aggs
7b50: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
7b60: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69      }.**     whi
7b70: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
7b80: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
7b90: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ue).**       Gos
7ba0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
7bb0: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20        Next(csr) 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
7be0: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
7bf0: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
7c00: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
7c10: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
7c20: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53     AggStep (csrS
7c30: 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a  tart, xInverse).
7c40: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
7c50: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
7c60: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
7c70: 0a 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22 43  .**   For the "C
7c80: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
7c90: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
7ca0: 4e 47 22 20 63 61 73 65 2c 20 74 68 65 20 66 69  NG" case, the fi
7cb0: 6e 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20 63  nal if() .**   c
7cc0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77 61  ondition is alwa
7cd0: 79 73 20 74 72 75 65 20 28 61 73 20 69 66 20 72  ys true (as if r
7ce0: 65 67 53 74 61 72 74 20 77 65 72 65 20 69 6e 69  egStart were ini
7cf0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e 0a  tialized to 0)..
7d00: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
7d10: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
7d20: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
7d30: 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20  LLOWING.** .**  
7d40: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
7d50: 79 20 52 41 4e 47 45 20 63 61 73 65 20 68 61 6e  y RANGE case han
7d60: 64 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  dled by this rou
7d70: 74 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69 65  tine. It modifie
7d80: 73 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f 6e  s the.**   secon
7d90: 64 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f 6f  d while( 1 ) loo
7da0: 70 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57 45  p in "ROWS BETWE
7db0: 45 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20 55  EN CURRENT ... U
7dc0: 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a  NBOUNDED..." to.
7dd0: 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  **   be:.**.**  
7de0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
7df0: 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
7e00: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
7e10: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
7e20: 2a 20 20 20 20 20 20 20 20 20 72 65 67 50 65 65  *         regPee
7e30: 72 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47  r++.**         G
7e40: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
7e50: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
7e60: 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  sr)             
7e70: 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f          // if EO
7e80: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
7e90: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
7ea0: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
7eb0: 65 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20  eer ) break;.** 
7ec0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
7ed0: 20 77 68 69 6c 65 28 20 28 72 65 67 50 65 65 72   while( (regPeer
7ee0: 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20  --)>0 ){.**     
7ef0: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
7f00: 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29  Start, xInverse)
7f10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
7f20: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
7f30: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
7f40: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
7f50: 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  N <expr> FOLLOWI
7f60: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
7f70: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
7f80: 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45     regEnd = regE
7f90: 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a  nd - regStart.**
7fa0: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
7fb0: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
7fc0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
7fd0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
7fe0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67  _done.**     Agg
7ff0: 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  step (csrEnd).**
8000: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
8010: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
8020: 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c    // if EOF fall
8030: 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20  -through.**     
8040: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
8050: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  0 ){.**       if
8060: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
8070: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
8080: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
8090: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
80a0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
80b0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
80c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
80d0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
80e0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
80f0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ne.**       }.**
8100: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
8110: 63 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72  csrStart, xInver
8120: 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  se).**       Nex
8130: 74 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  t (csrStart).** 
8140: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53      }.**.** ROWS
8150: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
8160: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
8170: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
8180: 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63  G.**.**   Replac
8190: 65 20 74 68 65 20 62 69 74 20 61 66 74 65 72 20  e the bit after 
81a0: 22 52 65 77 69 6e 64 22 20 69 6e 20 74 68 65 20  "Rewind" in the 
81b0: 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a  above with:.**.*
81c0: 2a 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e  *     if( (regEn
81d0: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
81e0: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
81f0: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65  End).**       Ne
8200: 78 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20  xt (csrEnd).**  
8210: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46     }.**     AggF
8220: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
8230: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
8240: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74  osub.**     Next
8250: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
8260: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
8270: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
8280: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
8290: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
82a0: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
82b0: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 32 2c    AggStep (csr2,
82c0: 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20   xInverse).**   
82d0: 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a      Next (csr2).
82e0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73  **     }.**.*/.s
82f0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
8300: 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
8310: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8320: 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  e, .  Select *p,
8330: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
8340: 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47  Info,.  int regG
8350: 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64  osub, .  int add
8360: 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64  rGosub.){.  Wind
8370: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
8380: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
8390: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
83a0: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
83b0: 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b  w *pWin;.  int k
83c0: 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70  ;.  int nSub = p
83d0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
83e0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72  b->nCol;.  int r
83f0: 65 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20  egFlushPart;    
8400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8410: 67 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75  gister for "Gosu
8420: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
8430: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46  n" */.  int lblF
8440: 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20  lushPart;       
8450: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
8460: 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73   for "Gosub flus
8470: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a  h_partition" */.
8480: 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f    int lblFlushDo
8490: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
84a0: 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22    /* Label for "
84b0: 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74  Gosub flush_part
84c0: 69 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a  ition_done" */..
84d0: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
84e0: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20  int nArg;.  int 
84f0: 61 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53  addr;.  int csrS
8500: 74 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tart = pParse->n
8510: 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72  Tab++;.  int csr
8520: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  End = pParse->nT
8530: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53  ab++;.  int regS
8540: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
8550: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
8560: 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43  e of <expr> PREC
8570: 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72  EDING */.  int r
8580: 65 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  egEnd;          
8590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
85a0: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46  alue of <expr> F
85b0: 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e  OLLOWING */.  in
85c0: 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 69 6e  t addrNext;.  in
85d0: 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e  t addrGoto;.  in
85e0: 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74  t addrTop;.  int
85f0: 20 61 64 64 72 49 66 50 6f 73 31 3b 0a 20 20 69   addrIfPos1;.  i
8600: 6e 74 20 61 64 64 72 49 66 50 6f 73 32 3b 0a 0a  nt addrIfPos2;..
8610: 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20    int regPeer = 
8620: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8630: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8640: 70 65 65 72 73 20 69 6e 20 63 75 72 72 65 6e 74  peers in current
8650: 20 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20   group */.  int 
8660: 72 65 67 50 65 65 72 56 61 6c 20 3d 20 30 3b 20  regPeerVal = 0; 
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8680: 41 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20  Array of values 
8690: 69 64 65 6e 74 69 66 79 69 6e 67 20 70 65 65 72  identifying peer
86a0: 20 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20   group */.  int 
86b0: 69 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  iPeer = 0;      
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86d0: 43 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 20 69 6e  Column offset in
86e0: 20 65 70 68 2d 74 61 62 6c 65 20 6f 66 20 70 65   eph-table of pe
86f0: 65 72 20 76 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  er vals */.  int
8700: 20 6e 50 65 65 72 56 61 6c 3b 20 20 20 20 20 20   nPeerVal;      
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8720: 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 65 72 20   Number of peer 
8730: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
8740: 62 52 61 6e 67 65 20 3d 20 30 3b 0a 20 20 69 6e  bRange = 0;.  in
8750: 74 20 72 65 67 53 69 7a 65 20 3d 20 30 3b 0a 0a  t regSize = 0;..
8760: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
8770: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
8780: 45 44 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c  EDING .       ||
8790: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
87a0: 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
87b0: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
87c0: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
87d0: 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57  G .       || pMW
87e0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
87f0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20  NBOUNDED .  );. 
8800: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
8810: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
8820: 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NG .       || pM
8830: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
8840: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c  RRENT .       ||
8850: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
8860: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
8870: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
8880: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
8890: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57  .  );..  if( pMW
88a0: 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
88b0: 4e 47 45 20 0a 20 20 20 26 26 20 70 4d 57 69 6e  NGE .   && pMWin
88c0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
88d0: 52 45 4e 54 20 0a 20 20 20 26 26 20 70 4d 57 69  RENT .   && pMWi
88e0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
88f0: 55 4e 44 45 44 0a 20 20 29 7b 0a 20 20 20 20 62  UNDED.  ){.    b
8900: 52 61 6e 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 0a  Range = 1;.  }..
8910: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
8920: 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
8930: 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
8940: 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
8950: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
8960: 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
8970: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
8980: 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
8990: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
89a0: 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  l(v);.  lblFlush
89b0: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
89c0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
89d0: 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b  .  regStart = ++
89e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
89f0: 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
8a00: 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64  e->nMem;..  wind
8a10: 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65  owPartitionCache
8a20: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
8a30: 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  fo, regFlushPart
8a40: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  , lblFlushPart, 
8a50: 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64  &regSize);..  ad
8a60: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
8a70: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8a80: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
8a90: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
8aa0: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
8ab0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
8ac0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
8ad0: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
8ae0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8af0: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
8b00: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8b10: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
8b20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8b30: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53  OP_OpenDup, csrS
8b40: 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  tart, pMWin->iEp
8b50: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
8b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b70: 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64  _OpenDup, csrEnd
8b80: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
8b90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68  );..  /* If eith
8ba0: 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72  er regStart or r
8bb0: 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f  egEnd are not no
8bc0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
8bd0: 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a  ers, throw .  **
8be0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
8bf0: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
8c00: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  pStart ){.    sq
8c10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
8c20: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
8c30: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
8c40: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46      windowCheckF
8c50: 72 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73 65  rameValue(pParse
8c60: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
8c70: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
8c80: 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  >pEnd ){.    sql
8c90: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8ca0: 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
8cb0: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
8cc0: 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65 56  indowCheckFrameV
8cd0: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
8ce0: 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  End, 1);.  }..  
8cf0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52  /* If this is "R
8d00: 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  OWS <expr1> FOLL
8d10: 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c  OWING AND ROWS <
8d20: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
8d30: 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ", do:.  **.  **
8d40: 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45     regEnd = regE
8d50: 6e 64 20 2d 20 72 65 67 53 74 61 72 74 3b 0a 20  nd - regStart;. 
8d60: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
8d70: 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e  >pEnd && pMWin->
8d80: 70 53 74 61 72 74 20 26 26 20 70 4d 57 69 6e 2d  pStart && pMWin-
8d90: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
8da0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  OWING ){.    ass
8db0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
8dc0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
8dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8de0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
8df0: 62 74 72 61 63 74 2c 20 72 65 67 53 74 61 72 74  btract, regStart
8e00: 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64  , regEnd, regEnd
8e10: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
8e20: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75  tialize the accu
8e30: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
8e40: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
8e50: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c   function to NUL
8e60: 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20  L */.  regArg = 
8e70: 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28  windowInitAccum(
8e80: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a  pParse, pMWin);.
8e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8ea0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
8eb0: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
8ec0: 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  r, lblFlushDone)
8ed0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
8ee0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
8ef0: 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c 62  nd, csrStart, lb
8f00: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69  P5(v, 1);.  sqli
8f30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8f40: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45   OP_Rewind, csrE
8f50: 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  nd, lblFlushDone
8f60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
8f70: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
8f80: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67  .  /* Invoke Agg
8f90: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  Step function fo
8fa0: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
8fb0: 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  nction using the
8fc0: 20 72 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 63   row that.  ** c
8fd0: 73 72 45 6e 64 20 63 75 72 72 65 6e 74 6c 79 20  srEnd currently 
8fe0: 70 6f 69 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69  points to. Or, i
8ff0: 66 20 63 73 72 45 6e 64 20 69 73 20 61 6c 72 65  f csrEnd is alre
9000: 61 64 79 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a  ady at EOF,.  **
9010: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f   do nothing.  */
9020: 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
9030: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9040: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 4d  ddr(v);.  if( pM
9050: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
9060: 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61  ECEDING ){.    a
9070: 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69  ddrIfPos1 = sqli
9080: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9090: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
90a0: 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 7d 0a 20  d, 0 , 1);.  }. 
90b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
90c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
90d0: 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64  srEnd, sqlite3Vd
90e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
90f0: 2b 32 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  +2);.  addr = sq
9100: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
9110: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 77  v, OP_Goto);.  w
9120: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
9130: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 45  rse, pMWin, csrE
9140: 6e 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72  nd, 0, regArg, r
9150: 65 67 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70  egSize);.  if( p
9160: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
9170: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
9180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9190: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
91a0: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 73   addrTop);.    s
91b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
91c0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
91d0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
91e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
91f0: 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r(v);.  }else{. 
9200: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
9210: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
9220: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
9230: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
9240: 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG ){.      sqli
9250: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9260: 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b 0a  v, addrIfPos1);.
9270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
9280: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
9290: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
92a0: 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20 73    addrIfPos1 = s
92b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
92c0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
92d0: 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20  gEnd, 0 , 1);.  
92e0: 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  }.  if( pMWin->e
92f0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
9300: 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49  ING ){.    addrI
9310: 66 50 6f 73 32 20 3d 20 73 71 6c 69 74 65 33 56  fPos2 = sqlite3V
9320: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9330: 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
9340: 20 30 20 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69   0 , 1);.  }.  i
9350: 66 28 20 62 52 61 6e 67 65 20 29 7b 0a 20 20 20  f( bRange ){.   
9360: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
9370: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
9380: 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 70 4f 72  NT && pMWin->pOr
9390: 64 65 72 42 79 20 29 3b 0a 20 20 20 20 72 65 67  derBy );.    reg
93a0: 50 65 65 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Peer = ++pParse-
93b0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 50 65  >nMem;.    regPe
93c0: 65 72 56 61 6c 20 3d 20 70 50 61 72 73 65 2d 3e  erVal = pParse->
93d0: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 69 50 65 65  nMem+1;.    iPee
93e0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  r = pMWin->nBuff
93f0: 65 72 43 6f 6c 20 2b 20 28 70 4d 57 69 6e 2d 3e  erCol + (pMWin->
9400: 70 50 61 72 74 69 74 69 6f 6e 3f 70 4d 57 69 6e  pPartition?pMWin
9410: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45  ->pPartition->nE
9420: 78 70 72 3a 30 29 3b 0a 20 20 20 20 6e 50 65 65  xpr:0);.    nPee
9430: 72 56 61 6c 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  rVal = pMWin->pO
9440: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
9450: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9460: 2b 3d 20 28 32 20 2a 20 6e 50 65 65 72 56 61 6c  += (2 * nPeerVal
9470: 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  );.    for(k=0; 
9480: 6b 3c 6e 50 65 65 72 56 61 6c 3b 20 6b 2b 2b 29  k<nPeerVal; k++)
9490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
94a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
94b0: 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69  Column, pMWin->i
94c0: 45 70 68 43 73 72 2c 20 69 50 65 65 72 2b 6b 2c  EphCsr, iPeer+k,
94d0: 20 72 65 67 50 65 65 72 56 61 6c 2b 6b 29 3b 0a   regPeerVal+k);.
94e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
94f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9500: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
9510: 67 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 77  gPeer);.  }..  w
9520: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
9530: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
9540: 0a 20 20 69 66 28 20 62 52 61 6e 67 65 20 29 7b  .  if( bRange ){
9550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9560: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
9570: 49 6d 6d 2c 20 72 65 67 50 65 65 72 2c 20 31 29  Imm, regPeer, 1)
9580: 3b 0a 20 20 7d 0a 20 20 77 69 6e 64 6f 77 52 65  ;.  }.  windowRe
9590: 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73  turnOneRow(pPars
95a0: 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73  e, pMWin, regGos
95b0: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
95c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
95d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
95e0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
95f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9600: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
9610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9620: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
9630: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
9640: 20 20 69 66 28 20 62 52 61 6e 67 65 20 29 7b 0a    if( bRange ){.
9650: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
9660: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
9670: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
9680: 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  st(pParse, pMWin
9690: 2d 3e 70 4f 72 64 65 72 42 79 2c 30 2c 30 29 3b  ->pOrderBy,0,0);
96a0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
96b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
96c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 34 3b  urrentAddr(v)-4;
96d0: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
96e0: 6e 50 65 65 72 56 61 6c 3b 20 6b 2b 2b 29 7b 0a  nPeerVal; k++){.
96f0: 20 20 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d        int iOut =
9700: 20 72 65 67 50 65 65 72 56 61 6c 20 2b 20 6e 50   regPeerVal + nP
9710: 65 65 72 56 61 6c 20 2b 20 6b 3b 0a 20 20 20 20  eerVal + k;.    
9720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9730: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9740: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
9750: 2c 20 69 50 65 65 72 2b 6b 2c 20 69 4f 75 74 29  , iPeer+k, iOut)
9760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9770: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9780: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
9790: 50 65 65 72 56 61 6c 2c 20 72 65 67 50 65 65 72  PeerVal, regPeer
97a0: 56 61 6c 2b 6e 50 65 65 72 56 61 6c 2c 20 6e 50  Val+nPeerVal, nP
97b0: 65 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  eerVal);.    sql
97c0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
97d0: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
97e0: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
97f0: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
9800: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9810: 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 73 71  ddr(v)+1;.    sq
9820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9830: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
9840: 2c 20 61 64 64 72 4a 75 6d 70 2c 20 61 64 64 72  , addrJump, addr
9850: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
9860: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
9870: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
9880: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
9890: 65 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73  ere(v, addrIfPos
98a0: 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  2);.  }..  if( p
98b0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
98c0: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 7c 7c 20  _CURRENT .   || 
98d0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
98e0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20  K_PRECEDING .   
98f0: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
9900: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a  ==TK_FOLLOWING .
9910: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64    ){.    int add
9920: 72 4a 75 6d 70 48 65 72 65 20 3d 20 30 3b 0a 20  rJumpHere = 0;. 
9930: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53     if( pMWin->eS
9940: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
9950: 4e 47 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  NG ){.      addr
9960: 4a 75 6d 70 48 65 72 65 20 3d 20 73 71 6c 69 74  JumpHere = sqlit
9970: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9980: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61  OP_IfPos, regSta
9990: 72 74 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20  rt, 0 , 1);.    
99a0: 7d 0a 20 20 20 20 69 66 28 20 62 52 61 6e 67 65  }.    if( bRange
99b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
99c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
99d0: 50 5f 49 66 50 6f 73 2c 20 72 65 67 50 65 65 72  P_IfPos, regPeer
99e0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
99f0: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 31  rentAddr(v)+2, 1
9a00: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d  );.      addrJum
9a10: 70 48 65 72 65 20 3d 20 73 71 6c 69 74 65 33 56  pHere = sqlite3V
9a20: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
9a30: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Goto);.    }.   
9a40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9a50: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
9a60: 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33  srStart, sqlite3
9a70: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9a80: 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  v)+1);.    windo
9a90: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
9aa0: 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72 74   pMWin, csrStart
9ab0: 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 1, regArg, reg
9ac0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 62  Size);.    if( b
9ad0: 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 73  Range ){.      s
9ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9af0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
9b00: 61 64 64 72 4a 75 6d 70 48 65 72 65 2d 31 29 3b  addrJumpHere-1);
9b10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
9b20: 64 64 72 4a 75 6d 70 48 65 72 65 20 29 7b 0a 20  ddrJumpHere ){. 
9b30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
9b50: 4a 75 6d 70 48 65 72 65 29 3b 0a 20 20 20 20 7d  JumpHere);.    }
9b60: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
9b70: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
9b80: 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69  WING ){.    sqli
9b90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9ba0: 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b 0a  v, addrIfPos1);.
9bb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
9bc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
9bd0: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
9be0: 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61 72  ..  /* flush_par
9bf0: 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a  tition_done: */.
9c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
9c10: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
9c20: 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71  FlushDone);.  sq
9c30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
9c40: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
9c50: 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  r, pMWin->iEphCs
9c60: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
9c70: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
9c80: 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61  turn, regFlushPa
9c90: 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rt);..  /* Jump 
9ca0: 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  to here to skip 
9cb0: 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69  over flush_parti
9cc0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
9cd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9ce0: 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 2f   addrGoto);.}../
9cf0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
9d00: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
9d10: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
9d20: 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66  NT ROW.**.**   f
9d30: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
9d40: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
9d50: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
9d60: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65  iEphCsr -> csrLe
9d70: 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ad).**     }.** 
9d80: 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20      Integer ctr 
9d90: 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  0.**     foreach
9da0: 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
9db0: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
9dc0: 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20   peer ){.**     
9dd0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
9de0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
9df0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
9e00: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
9e10: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
9e20: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sub.**          
9e30: 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
9e40: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
9e50: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74        Integer ct
9e60: 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  r 0.**       }.*
9e70: 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20  *       AggStep 
9e80: 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20  (csrLead).**    
9e90: 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20     Incr ctr.**  
9ea0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41     }.**.**     A
9eb0: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
9ec0: 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69  ze).**     for(i
9ed0: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
9ee0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
9ef0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
9f00: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
9f10: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
9f20: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
9f30: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
9f40: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
9f50: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
9f60: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
9f70: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 41 4e  RRENT ROW.** RAN
9f80: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
9f90: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
9fa0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
9fb0: 4c 4f 57 49 4e 47 0a 2a 2a 20 52 41 4e 47 45 20  LOWING.** RANGE 
9fc0: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
9fd0: 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ROW AND CURRENT 
9fe0: 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  ROW .**.**   TOD
9ff0: 4f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  O..*/.static voi
a000: 64 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68  d windowCodeCach
a010: 65 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  eStep(.  Parse *
a020: 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
a030: 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
a040: 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
a050: 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
a060: 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
a070: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
a080: 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
a090: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
a0a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a0b0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
a0c0: 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64  int k;.  int add
a0d0: 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
a0e0: 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50  Part = pMWin->pP
a0f0: 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72  artition;.  Expr
a100: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
a110: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
a120: 3b 0a 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20  ;.  int nPeer = 
a130: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
a140: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
a150: 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  r;..  int addrGo
a160: 74 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  to;             
a170: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
a180: 20 6f 66 20 47 6f 74 6f 20 75 73 65 64 20 74 6f   of Goto used to
a190: 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70 61 72 2e   jump flush_par.
a1a0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  . */.  int addrR
a1b0: 65 77 69 6e 64 3b 20 20 20 20 20 20 20 20 20 20  ewind;          
a1c0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a1d0: 73 20 6f 66 20 52 65 77 69 6e 64 20 74 68 61 74  s of Rewind that
a1e0: 20 73 74 61 72 74 73 20 6c 6f 6f 70 20 2a 2f 0a   starts loop */.
a1f0: 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
a200: 72 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75  rt;.  int lblFlu
a210: 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 63 73  shPart;.  int cs
a220: 72 4c 65 61 64 3b 0a 20 20 69 6e 74 20 72 65 67  rLead;.  int reg
a230: 43 74 72 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  Ctr;.  int regAr
a240: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
a250: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a260: 65 72 20 61 72 72 61 79 20 74 6f 20 6d 61 72 74  er array to mart
a270: 69 61 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  ial function arg
a280: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 69  s */.  int regSi
a290: 7a 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ze;.  int nArg;.
a2a0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 57 69  .  assert( (pMWi
a2b0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
a2c0: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
a2d0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
a2e0: 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  NT) .       || (
a2f0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
a300: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
a310: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
a320: 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 20 20 20  NBOUNDED) .     
a330: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
a340: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
a350: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
a360: 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 29  TK_CURRENT) .  )
a370: 3b 0a 0a 20 20 72 65 67 4e 65 77 50 65 65 72 20  ;..  regNewPeer 
a380: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
a390: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
a3a0: 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20 20 2f 2a   += nPeer;..  /*
a3b0: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
a3c0: 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72  er and label for
a3d0: 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74   the "flush_part
a3e0: 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69  ition" sub-routi
a3f0: 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73  ne. */.  regFlus
a400: 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
a410: 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75  ->nMem;.  lblFlu
a420: 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33  shPart = sqlite3
a430: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
a440: 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20 3d 20 70  ;..  csrLead = p
a450: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
a460: 20 72 65 67 43 74 72 20 3d 20 2b 2b 70 50 61 72   regCtr = ++pPar
a470: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e  se->nMem;..  win
a480: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
a490: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  e(pParse, p, pWI
a4a0: 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72  nfo, regFlushPar
a4b0: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  t, lblFlushPart,
a4c0: 20 26 72 65 67 53 69 7a 65 29 3b 0a 20 20 61 64   &regSize);.  ad
a4d0: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
a4e0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
a4f0: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
a500: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
a510: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
a520: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a530: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
a540: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
a550: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a560: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
a570: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a580: 72 28 76 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74  r(v)+2);.  sqlit
a590: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a5a0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 4c  OP_OpenDup, csrL
a5b0: 65 61 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ead, pMWin->iEph
a5c0: 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  Csr);..  /* Init
a5d0: 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d  ialize the accum
a5e0: 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20  ulator register 
a5f0: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
a600: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c  function to NULL
a610: 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77   */.  regArg = w
a620: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70  indowInitAccum(p
a630: 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a  Parse, pMWin);..
a640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a650: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
a660: 72 2c 20 30 2c 20 72 65 67 43 74 72 29 3b 0a 20  r, 0, regCtr);. 
a670: 20 61 64 64 72 52 65 77 69 6e 64 20 3d 20 73 71   addrRewind = sq
a680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a690: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
a6a0: 72 4c 65 61 64 29 3b 0a 20 20 73 71 6c 69 74 65  rLead);.  sqlite
a6b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
a6c0: 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d  P_Rewind, pMWin-
a6d0: 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 69 66  >iEphCsr);..  if
a6e0: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4d  ( pOrderBy && pM
a6f0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
a700: 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74  RRENT ){.    int
a710: 20 62 43 75 72 72 65 6e 74 20 3d 20 28 70 4d 57   bCurrent = (pMW
a720: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
a730: 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65  RENT && pMWin->e
a740: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
a750: 54 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  T);.    int addr
a760: 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Jump = 0;       
a770: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
a780: 20 6f 66 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f   of OP_Jump belo
a790: 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4d 57  w */.    if( pMW
a7a0: 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
a7b0: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NGE ){.      int
a7c0: 20 69 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e   iOff = pMWin->n
a7d0: 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61  BufferCol + (pPa
a7e0: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
a7f0: 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 6e  r : 0);.      in
a800: 74 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69  t regPeer = pMWi
a810: 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20 28 70 50  n->regPart + (pP
a820: 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
a830: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 4b  pr : 0);.      K
a840: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
a850: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
a860: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
a870: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
a880: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  0, 0);.      for
a890: 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b  (k=0; k<nPeer; k
a8a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
a8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a8c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
a8d0: 4c 65 61 64 2c 20 69 4f 66 66 2b 6b 2c 20 72 65  Lead, iOff+k, re
a8e0: 67 4e 65 77 50 65 65 72 2b 6b 29 3b 0a 20 20 20  gNewPeer+k);.   
a8f0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
a900: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
a910: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
a920: 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  e, regNewPeer, r
a930: 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a  egPeer, nPeer);.
a940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a950: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
a960: 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
a970: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
a980: 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
a990: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a9a0: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
a9b0: 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
a9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
a9e0: 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
a9f0: 67 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b  gPeer, nPeer-1);
aa00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64  .    }..    wind
aa10: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61  owReturnRows(pPa
aa20: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43  rse, pMWin, regC
aa30: 74 72 2c 20 30 2c 20 72 65 67 47 6f 73 75 62 2c  tr, 0, regGosub,
aa40: 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
aa50: 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
aa60: 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
aa70: 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
aa80: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
aa90: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
aaa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
aab0: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
aac0: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  );.  }..  window
aad0: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
aae0: 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20  pMWin, csrLead, 
aaf0: 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69  0, regArg, regSi
ab00: 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ze);.  sqlite3Vd
ab10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
ab20: 64 64 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20 31  ddImm, regCtr, 1
ab30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ab40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
ab50: 74 2c 20 63 73 72 4c 65 61 64 2c 20 61 64 64 72  t, csrLead, addr
ab60: 52 65 77 69 6e 64 2b 32 29 3b 0a 0a 20 20 77 69  Rewind+2);..  wi
ab70: 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70  ndowReturnRows(p
ab80: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
ab90: 67 43 74 72 2c 20 31 2c 20 72 65 67 47 6f 73 75  gCtr, 1, regGosu
aba0: 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 30 2c  b, addrGosub, 0,
abb0: 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56   0);..  sqlite3V
abc0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
abd0: 64 64 72 52 65 77 69 6e 64 29 3b 0a 20 20 73 71  ddrRewind);.  sq
abe0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
abf0: 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e 64 2b  e(v, addrRewind+
ac00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
ac10: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
ac20: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
ac30: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71  ->iEphCsr);.  sq
ac40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ac50: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
ac60: 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20  gFlushPart);..  
ac70: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
ac80: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
ac90: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
aca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
acb0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
acc0: 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41  o);.}.../*.** RA
acd0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
ace0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
acf0: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
ad00: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20  **.**   ....**  
ad10: 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
ad20: 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
ad30: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
ad40: 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47  lize).**       G
ad50: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
ad60: 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72  *       ResetSor
ad70: 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a  ter eph-table.**
ad80: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c       }.**     el
ad90: 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72 20  se if( new peer 
ada0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
adb0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
adc0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
add0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
ade0: 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d  ResetSorter eph-
adf0: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a  table.**     }.*
ae00: 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a  *     AggStep.**
ae10: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
ae20: 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62  ord into eph-tab
ae30: 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  le).**   sqlite3
ae40: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
ae50: 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c  AggFinal (xFinal
ae60: 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20  ize).**   Gosub 
ae70: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20  addrGosub.**.** 
ae80: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e  RANGE BETWEEN UN
ae90: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
aea0: 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  G AND UNBOUNDED 
aeb0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
aec0: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
aed0: 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f  pt take no actio
aee0: 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65  n for a "new pee
aef0: 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20  r". Invoke.**   
af00: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
af10: 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61  once only for ea
af20: 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a  ch partition..**
af30: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
af40: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
af50: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
af60: 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20  .**   As above, 
af70: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
af80: 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69  "new peer" condi
af90: 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20  tion is handled 
afa0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65  in the.**   same
afb0: 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61 72   way as "new par
afc0: 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72  tition" (so ther
afd0: 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66  e is no "else if
afe0: 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20  " block)..**.** 
aff0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
b000: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
b010: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
b020: 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f  .** .**   As abo
b030: 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d  ve, except assum
b040: 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20 61  e every row is a
b050: 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a   "new peer"..*/.
b060: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
b070: 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
b080: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
b090: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
b0a0: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
b0b0: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
b0c0: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
b0d0: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
b0e0: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
b0f0: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
b100: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b110: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
b120: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20  ow *pWin;.  int 
b130: 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72  k;.  int iSubCsr
b140: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
b150: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  .iCursor;.  int 
b160: 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSub = p->pSrc->
b170: 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
b180: 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61  .  int reg = pPa
b190: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69  rse->nMem+1;.  i
b1a0: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72  nt regRecord = r
b1b0: 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72  eg+nSub;.  int r
b1c0: 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63  egRowid = regRec
b1d0: 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64  ord+1;.  int add
b1e0: 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
b1f0: 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50  Part = pMWin->pP
b200: 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72  artition;.  Expr
b210: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
b220: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
b230: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  ;..  assert( pMW
b240: 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
b250: 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70  NGE .      || (p
b260: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
b270: 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
b280: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
b290: 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61  RRENT).  );..  a
b2a0: 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65  ssert( (pMWin->e
b2b0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
b2c0: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
b2d0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a  nd==TK_CURRENT).
b2e0: 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e         || (pMWin
b2f0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
b300: 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
b310: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
b320: 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  DED).       || (
b330: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
b340: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
b350: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
b360: 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20  RENT).       || 
b370: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
b380: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
b390: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
b3a0: 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64  BOUNDED && !pOrd
b3b0: 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66  erBy).  );..  if
b3c0: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
b3d0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
b3e0: 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
b3f0: 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e  .  }..  pParse->
b400: 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32  nMem += nSub + 2
b410: 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20  ;..  /* Martial 
b420: 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
b430: 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65   by the sub-sele
b440: 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ct into an array
b450: 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74   of .  ** regist
b460: 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  ers. */.  for(k=
b470: 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b  0; k<nSub; k++){
b480: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b490: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b4a0: 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
b4b0: 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20   reg+k);.  }..  
b4c0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
b4d0: 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66   is the start of
b4e0: 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e   a new partition
b4f0: 20 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20   or peer group. 
b500: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c  */.  if( pPart |
b510: 7c 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  | pOrderBy ){.  
b520: 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70    int nPart = (p
b530: 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45  Part ? pPart->nE
b540: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  xpr : 0);.    in
b550: 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a  t addrGoto = 0;.
b560: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
b570: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50   = 0;.    int nP
b580: 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20  eer = (pOrderBy 
b590: 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
b5a0: 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28  r : 0);..    if(
b5b0: 20 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20   pPart ){.      
b5c0: 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d  int regNewPart =
b5d0: 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
b5e0: 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20  ufferCol;.      
b5f0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
b600: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
b610: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
b620: 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
b630: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   0);.      addr 
b640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b650: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
b660: 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  e, regNewPart, p
b670: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50  MWin->regPart,nP
b680: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
b690: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
b6a0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
b6b0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
b6c0: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
b6d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b6e0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
b6f0: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
b700: 32 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  2);.      window
b710: 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
b720: 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20 20   pMWin, 1);.    
b730: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
b740: 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 47 6f  {.        addrGo
b750: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
b760: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
b770: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
b780: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  }..    if( pOrde
b790: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
b7a0: 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65   regNewPeer = re
b7b0: 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  g + pMWin->nBuff
b7c0: 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20  erCol + nPart;. 
b7d0: 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72       int regPeer
b7e0: 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72   = pMWin->regPar
b7f0: 74 20 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20  t + nPart;..    
b800: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
b810: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b820: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
b830: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  );.      if( pMW
b840: 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
b850: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 4b  NGE ){.        K
b860: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
b870: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
b880: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
b890: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
b8a0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  0, 0);.        a
b8b0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
b8c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
b8d0: 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65  mpare, regNewPee
b8e0: 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65  r, regPeer, nPee
b8f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
b900: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
b910: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
b920: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
b930: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d  .        addrJum
b940: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
b950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
b960: 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
b970: 72 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  r+2);.      }els
b980: 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a  e{.        addrJ
b990: 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ump = 0;.      }
b9a0: 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67  .      windowAgg
b9b0: 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d  Final(pParse, pM
b9c0: 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61  Win, pMWin->eSta
b9d0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b  rt==TK_CURRENT);
b9e0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 47  .      if( addrG
b9f0: 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  oto ) sqlite3Vdb
ba00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
ba10: 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  rGoto);.    }.. 
ba20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ba30: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
ba40: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
ba50: 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  r,sqlite3VdbeCur
ba60: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
ba70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ba80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
ba90: 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  b, regGosub, add
baa0: 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73 71 6c  rGosub);.    sql
bab0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bac0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
bad0: 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
bae0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
baf0: 72 28 76 29 2d 31 29 3b 0a 0a 20 20 20 20 73 71  r(v)-1);..    sq
bb00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bb10: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
bb20: 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  r, pMWin->iEphCs
bb30: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
bb40: 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20  dbeAddOp3(.     
bb50: 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72     v, OP_Copy, r
bb60: 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65  eg+pMWin->nBuffe
bb70: 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  rCol, pMWin->reg
bb80: 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65 65  Part, nPart+nPee
bb90: 72 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  r-1.    );..    
bba0: 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
bbb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
bbc0: 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
bbd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  .  }..  /* Invok
bbe0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
bbf0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
bc00: 69 6f 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f 77  ions */.  window
bc10: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
bc20: 70 4d 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72 65  pMWin, -1, 0, re
bc30: 67 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75 66  g, 0);..  /* Buf
bc40: 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  fer the current 
bc50: 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d  row in the ephem
bc60: 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  eral table. */. 
bc70: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75 66   if( pMWin->nBuf
bc80: 66 65 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ferCol>0 ){.    
bc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bca0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
bcb0: 72 64 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d 3e  rd, reg, pMWin->
bcc0: 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67 52  nBufferCol, regR
bcd0: 65 63 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  ecord);.  }else{
bce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bcf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp2(v, OP_Blo
bd00: 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64 29  b, 0, regRecord)
bd10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bd20: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
bd30: 69 64 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a  id*)"", 0);.  }.
bd40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd50: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
bd60: 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  id, pMWin->iEphC
bd70: 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  sr, regRowid);. 
bd80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bd90: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
bda0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
bdb0: 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
bdc0: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64  owid);..  /* End
bdd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
bde0: 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73 71  an loop. */.  sq
bdf0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
be00: 49 6e 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f 77  Info);..  window
be10: 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
be20: 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73 71   pMWin, 1);.  sq
be30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
be40: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d  v, OP_Rewind, pM
be50: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c  Win->iEphCsr,sql
be60: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
be70: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c  ddr(v)+3);.  sql
be80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
be90: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
bea0: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
beb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
bec0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bed0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
bee0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
bef0: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a  rentAddr(v)-1);.
bf00: 7d 0a 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74  }..Window *sqlit
bf10: 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69  e3WindowDup(sqli
bf20: 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20  te3 *db, Window 
bf30: 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
bf40: 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  New = 0;.  if( p
bf50: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   ){.    pNew = s
bf60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
bf70: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  ro(db, sizeof(Wi
bf80: 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20  ndow));.    if( 
bf90: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
bfa0: 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71  ew->pFilter = sq
bfb0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bfc0: 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b   p->pFilter, 0);
bfd0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  .      pNew->pPa
bfe0: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
bff0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c000: 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20   p->pPartition, 
c010: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
c020: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
c030: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c040: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
c050: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  );.      pNew->e
c060: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
c070: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e  .      pNew->eEn
c080: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
c090: 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20     pNew->eStart 
c0a0: 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
c0b0: 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20     pNew->pStart 
c0c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
c0d0: 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 74 61 72  (db, pNew->pStar
c0e0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
c0f0: 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  w->pEnd = sqlite
c100: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
c110: 77 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  w->pEnd, 0);.   
c120: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c130: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
c140: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
c150: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
c160: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
c170: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
c180: 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
c190: 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e  t take no action
c1a0: 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72   for a "new peer
c1b0: 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74  ". Invoke.**   t
c1c0: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f  he sub-routine o
c1d0: 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63  nce only for eac
c1e0: 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a  h partition..**.
c1f0: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
c200: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
c210: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
c220: 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65  **   As above, e
c230: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22  xcept that the "
c240: 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74  new peer" condit
c250: 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69  ion is handled i
c260: 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20  n the.**   same 
c270: 77 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74  way as "new part
c280: 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65  ition" (so there
c290: 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22   is no "else if"
c2a0: 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52   block)..**.** R
c2b0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
c2c0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
c2d0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
c2e0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 65 20 77 61 79  .**.**   One way
c2f0: 20 69 73 20 74 6f 20 6a 75 73 74 20 72 65 76 65   is to just reve
c300: 72 73 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64  rse the sort ord
c310: 65 72 20 61 6e 64 20 64 6f 20 61 73 20 66 6f 72  er and do as for
c320: 20 42 45 54 57 45 45 4e 20 0a 2a 2a 20 20 20 55   BETWEEN .**   U
c330: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
c340: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
c350: 4f 57 2e 20 42 75 74 20 74 68 61 74 20 69 73 20  OW. But that is 
c360: 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61  not quite the sa
c370: 6d 65 20 66 6f 72 0a 2a 2a 20 20 20 74 68 69 6e  me for.**   thin
c380: 67 73 20 6c 69 6b 65 20 67 72 6f 75 70 5f 63 6f  gs like group_co
c390: 6e 63 61 74 28 29 2e 20 41 6e 64 20 70 65 72 68  ncat(). And perh
c3a0: 61 70 73 20 6f 74 68 65 72 20 75 73 65 72 20 64  aps other user d
c3b0: 65 66 69 6e 65 64 20 61 67 67 72 65 67 61 74 65  efined aggregate
c3c0: 73 20 0a 2a 2a 20 20 20 61 73 20 77 65 6c 6c 2e  s .**   as well.
c3d0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
c3e0: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
c3f0: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
c400: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
c410: 72 74 69 74 69 6f 6e 3b 0a 2a 2a 20 20 20 20 20  rtition;.**     
c420: 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70    ResetSorter ep
c430: 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d  h-table.**     }
c440: 0a 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a  .**     AggStep.
c450: 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72  **     Insert (r
c460: 65 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74  ecord into eph-t
c470: 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74  able).**   sqlit
c480: 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
c490: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
c4a0: 72 74 69 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 66  rtition.**.**  f
c4b0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
c4c0: 2a 2a 20 20 20 4f 70 65 6e 44 75 70 20 28 63 73  **   OpenDup (cs
c4d0: 72 20 2d 3e 20 63 73 72 32 29 0a 2a 2a 20 20 20  r -> csr2).**   
c4e0: 66 6f 72 65 61 63 68 20 28 72 65 63 6f 72 64 20  foreach (record 
c4f0: 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 20 7b 0a  in eph-table) {.
c500: 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
c510: 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  eer ){.**       
c520: 77 68 69 6c 65 28 20 63 73 72 32 21 3d 63 73 72  while( csr2!=csr
c530: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
c540: 67 67 53 74 65 70 20 28 78 49 6e 76 65 72 73 65  ggStep (xInverse
c550: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78  ).**         Nex
c560: 74 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20 20  t (csr2).**     
c570: 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
c580: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
c590: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73  alue).**     Gos
c5a0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
c5b0: 20 20 7d 0a 2a 2a 0a 2a 2a 3d 3d 3d 3d 3d 3d 3d    }.**.**=======
c5c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c5d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c5e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c5f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c600: 3d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  =.**.** ROWS BET
c610: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
c620: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
c630: 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 20 20 2e 2e  RENT ROW.**   ..
c640: 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
c650: 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
c660: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
c670: 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
c680: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 53     }.**     AggS
c690: 74 65 70 0a 2a 2a 20 20 20 20 20 41 67 67 46 69  tep.**     AggFi
c6a0: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
c6b0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
c6c0: 73 75 62 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  sub.**   sqlite3
c6d0: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 0a 2a 2f  WhereEnd().**.*/
c6e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
c6f0: 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50  dowCodeStep(.  P
c700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
c710: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
c720: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
c730: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
c740: 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
c750: 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
c760: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
c770: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
c780: 0a 20 20 69 66 28 20 28 70 4d 57 69 6e 2d 3e 65  .  if( (pMWin->e
c790: 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20  Type==TK_ROWS . 
c7a0: 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74    && (pMWin->eSt
c7b0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
c7c0: 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  D||pMWin->eEnd!=
c7d0: 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57  TK_CURRENT||!pMW
c7e0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 29 0a 20  in->pOrderBy)). 
c7f0: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
c800: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 26  art==TK_CURRENT&
c810: 26 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b  &pMWin->eEnd==TK
c820: 5f 55 4e 42 4f 55 4e 44 45 44 26 26 70 4d 57 69  _UNBOUNDED&&pMWi
c830: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20 29  n->pOrderBy).  )
c840: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
c850: 52 6f 77 45 78 70 72 53 74 65 70 28 70 50 61 72  RowExprStep(pPar
c860: 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72  se, p, pWInfo, r
c870: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
c880: 75 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ub);.    return;
c890: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e  .  }..  for(pWin
c8a0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
c8b0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
c8c0: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
c8d0: 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
c8e0: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
c8f0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
c900: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  & SQLITE_FUNC_WI
c910: 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20 20 20  NDOW_SIZE).     
c920: 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e  || (pFunc->xSFun
c930: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
c940: 46 75 6e 63 29 0a 20 20 20 20 20 7c 7c 20 28 70  Func).     || (p
c950: 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69  Func->xSFunc==fi
c960: 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  rst_valueStepFun
c970: 63 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  c).     || (pFun
c980: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
c990: 74 65 70 46 75 6e 63 29 0a 20 20 20 20 20 7c 7c  tepFunc).     ||
c9a0: 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d   (pFunc->xSFunc=
c9b0: 3d 6c 61 67 53 74 65 70 46 75 6e 63 29 0a 20 20  =lagStepFunc).  
c9c0: 20 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f    ){.      windo
c9d0: 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 70  wCodeCacheStep(p
c9e0: 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f  Parse, p, pWInfo
c9f0: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
ca00: 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 72 65  Gosub);.      re
ca10: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
ca20: 0a 20 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  .  windowCodeDef
ca30: 61 75 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c  aultStep(pParse,
ca40: 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
ca50: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
ca60: 3b 0a 7d 0a 0a                                   ;.}..