/ Hex Artifact Content
Login

Artifact 141a79da0fac93514a4c3f2530e52d22cb74622daf08fb9023668133ad4e285c:


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 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2450: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 46 75  Window *pWin, Fu
2460: 6e 63 44 65 66 20 2a 70 46 75 6e 63 29 7b 0a 20  ncDef *pFunc){. 
2470: 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75 6e 63   if( pFunc->func
2480: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2490: 55 4e 43 5f 57 49 4e 44 4f 57 20 29 7b 0a 20 20  UNC_WINDOW ){.  
24a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
24c0: 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e  if( pFunc->xSFun
24d0: 63 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 53 74 65  c==row_numberSte
24e0: 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d 3e  pFunc || pFunc->
24f0: 78 53 46 75 6e 63 3d 3d 6e 74 69 6c 65 53 74 65  xSFunc==ntileSte
2500: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  pFunc ){.      s
2510: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2520: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72  (db, pWin->pStar
2530: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2540: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
2550: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
2560: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
2570: 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30  = pWin->pEnd = 0
2580: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54  ;.      pWin->eT
2590: 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20  ype = TK_ROWS;. 
25a0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
25b0: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
25c0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
25d0: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
25e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25f0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 64  pFunc->xSFunc==d
2600: 65 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e  ense_rankStepFun
2610: 63 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75  c || pFunc->xSFu
2620: 6e 63 3d 3d 72 61 6e 6b 53 74 65 70 46 75 6e 63  nc==rankStepFunc
2630: 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e  .     || pFunc->
2640: 78 53 46 75 6e 63 3d 3d 70 65 72 63 65 6e 74 5f  xSFunc==percent_
2650: 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c 20  rankStepFunc || 
2660: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 63  pFunc->xSFunc==c
2670: 75 6d 65 5f 64 69 73 74 53 74 65 70 46 75 6e 63  ume_distStepFunc
2680: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
2690: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
26a0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
26b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
26d0: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
26e0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
26f0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b   pWin->pEnd = 0;
2700: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  .      pWin->eTy
2710: 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20  pe = TK_RANGE;. 
2720: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
2730: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
2740: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
2750: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
2760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79  .    }.  }.}..ty
2770: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69 6e  pedef struct Win
2780: 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64 6f  dowRewrite Windo
2790: 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63 74  wRewrite;.struct
27a0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 7b   WindowRewrite {
27b0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
27c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75  .  ExprList *pSu
27d0: 62 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  b;.};..static in
27e0: 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  t selectWindowRe
27f0: 77 72 69 74 65 53 65 6c 65 63 74 43 62 28 57 61  writeSelectCb(Wa
2800: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2810: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2820: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72  .  return WRC_Pr
2830: 75 6e 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  une;.}..static i
2840: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
2850: 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61 6c  ewriteExprCb(Wal
2860: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2870: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 74  pr *pExpr){.  st
2880: 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69  ruct WindowRewri
2890: 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  te *p = pWalker-
28a0: 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 50  >u.pRewrite;.  P
28b0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
28c0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
28d0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
28e0: 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73  ->op ){..    cas
28f0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
2900: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2910: 70 57 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pWin==0 ){.     
2920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2930: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 57  }else{.        W
2940: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
2950: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d       for(pWin=p-
2960: 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  >pWin; pWin; pWi
2970: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
2980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2990: 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d 70 57   pExpr->pWin==pW
29a0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
29b0: 20 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e 70    pExpr->pWin->p
29c0: 4f 77 6e 65 72 20 3d 20 70 45 78 70 72 3b 0a 20  Owner = pExpr;. 
29d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
29e0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
29f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2a10: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
2a20: 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  .  */..    case 
2a30: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
2a40: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
2a50: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
2a60: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
2a70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
2a80: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Sub = sqlite3Exp
2a90: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2aa0: 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75  se, p->pSub, pDu
2ab0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p);.      if( p-
2ac0: 3e 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >pSub ){.       
2ad0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
2ae0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2af0: 45 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b  EP_Static)==0 );
2b00: 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
2b10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2b20: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
2b30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2b40: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
2b50: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2b60: 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
2b70: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
2b80: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d  atic);.        m
2b90: 65 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20  emset(pExpr, 0, 
2ba0: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
2bb0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
2bc0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
2bd0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
2be0: 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d  olumn = p->pSub-
2bf0: 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20  >nExpr-1;.      
2c00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2c10: 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43  = p->pWin->iEphC
2c20: 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  sr;.      }..   
2c30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2c40: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a  .    default: /*
2c50: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
2c60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
2c70: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2c80: 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  e;.}..static int
2c90: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
2ca0: 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72  riteEList(.  Par
2cb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
2cc0: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 45  indow *pWin,.  E
2cd0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cf0: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
2d00: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
2d10: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
2d20: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
2d30: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2d40: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
2d50: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
2d60: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
2d70: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
2d80: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
2d90: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d    int rc;..  mem
2da0: 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
2db0: 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29   sizeof(Walker))
2dc0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77  ;.  memset(&sRew
2dd0: 72 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rite, 0, sizeof(
2de0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b  WindowRewrite));
2df0: 0a 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 75  ..  sRewrite.pSu
2e00: 62 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52  b = *ppSub;.  sR
2e10: 65 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57  ewrite.pWin = pW
2e20: 69 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  in;..  sWalker.p
2e30: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2e40: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
2e50: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2e60: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
2e70: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
2e80: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2e90: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
2ea0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
2eb0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
2ec0: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
2ed0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
2ee0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
2ef0: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
2f00: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
2f10: 69 74 65 2e 70 53 75 62 3b 0a 20 20 72 65 74 75  ite.pSub;.  retu
2f20: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
2f30: 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c   ExprList *exprL
2f40: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20  istAppendList(. 
2f50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2f70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2f80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2f90: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
2fa0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
2fb0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
2fc0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2fd0: 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20   *pAppend       
2fe0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
2ff0: 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  s to append. Mig
3000: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3010: 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29  .  if( pAppend )
3020: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
3030: 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69   int nInit = pLi
3040: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
3050: 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  r : 0;.    for(i
3060: 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e  =0; i<pAppend->n
3070: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3080: 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
3090: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
30a0: 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e  arse->db, pAppen
30b0: 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30  d->a[i].pExpr, 0
30c0: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  );.      pList =
30d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
30e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
30f0: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
3100: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70     if( pList ) p
3110: 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d  List->a[nInit+i]
3120: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70  .sortOrder = pAp
3130: 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  pend->a[i].sortO
3140: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
3150: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
3160: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
3170: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3180: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
3190: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64  econd argument d
31a0: 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a  oes not invoke.*
31b0: 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77  * any SQL window
31c0: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73   functions, this
31d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
31e0: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
31f0: 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73   it .** rewrites
3200: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3210: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69  ement so that wi
3220: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53  ndow function xS
3230: 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  tep functions.**
3240: 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20   are invoked in 
3250: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
3260: 72 2e 20 54 68 65 20 73 69 6d 70 6c 65 73 74 20  r. The simplest 
3270: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 0a  version of the .
3280: 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ** transformatio
3290: 6e 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  n is:.**.**   SE
32a0: 4c 45 43 54 20 77 69 6e 28 61 72 67 73 2e 2e 2e  LECT win(args...
32b0: 29 20 4f 56 45 52 20 28 3c 6c 69 73 74 31 3e 29  ) OVER (<list1>)
32c0: 20 46 52 4f 4d 20 3c 73 72 63 3e 20 4f 52 44 45   FROM <src> ORDE
32d0: 52 20 42 59 20 3c 6c 69 73 74 32 3e 0a 2a 2a 0a  R BY <list2>.**.
32e0: 2a 2a 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 53 45  ** to.**.**   SE
32f0: 4c 45 43 54 20 77 69 6e 28 61 72 67 73 2e 2e 2e  LECT win(args...
3300: 29 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20  ) FROM (.**     
3310: 53 45 4c 45 43 54 20 61 72 67 73 2e 2e 2e 20 46  SELECT args... F
3320: 52 4f 4d 20 3c 73 72 63 3e 20 4f 52 44 45 52 20  ROM <src> ORDER 
3330: 42 59 20 3c 6c 69 73 74 31 3e 0a 2a 2a 20 20 20  BY <list1>.**   
3340: 29 20 4f 52 44 45 52 20 42 59 20 3c 6c 69 73 74  ) ORDER BY <list
3350: 32 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c  2>.**.** where <
3360: 73 72 63 3e 20 6d 61 79 20 63 6f 6e 74 61 69 6e  src> may contain
3370: 20 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59   WHERE, GROUP BY
3380: 20 61 6e 64 20 48 41 56 49 4e 47 20 63 6c 61 75   and HAVING clau
3390: 73 65 73 2c 20 61 6e 64 20 3c 6c 69 73 74 31 3e  ses, and <list1>
33a0: 0a 2a 2a 20 69 73 20 74 68 65 20 63 6f 6e 63 61  .** is the conca
33b0: 74 65 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  tenation of the 
33c0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
33d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33e0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 56 45 52  s in the.** OVER
33f0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2f 0a 69   clause..**.*/.i
3400: 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  nt sqlite3Window
3410: 52 65 77 72 69 74 65 28 50 61 72 73 65 20 2a 70  Rewrite(Parse *p
3420: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
3430: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3440: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3450: 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 56 64  ->pWin ){.    Vd
3460: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
3470: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
3480: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
3490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
34a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c  rse->db;.    Sel
34b0: 65 63 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20  ect *pSub = 0;  
34c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
34d0: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
34e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
34f0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45  = p->pSrc;.    E
3500: 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d  xpr *pWhere = p-
3510: 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70  >pWhere;.    Exp
3520: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20  rList *pGroupBy 
3530: 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
3540: 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67     Expr *pHaving
3550: 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
3560: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f     ExprList *pSo
3570: 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70  rt = 0;..    Exp
3580: 72 4c 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20  rList *pSublist 
3590: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78  = 0;       /* Ex
35a0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f  pression list fo
35b0: 72 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  r sub-query */. 
35c0: 20 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e     Window *pMWin
35d0: 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20   = p->pWin;     
35e0: 20 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f   /* Master windo
35f0: 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  w object */.    
3600: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20  Window *pWin;   
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
3630: 74 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  terator */..    
3640: 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
3650: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
3660: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
3670: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  = 0;.    p->pHav
3680: 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ing = 0;..    /*
3690: 20 41 73 73 69 67 6e 20 61 20 63 75 72 73 6f 72   Assign a cursor
36a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
36b0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
36c0: 75 73 65 64 20 74 6f 20 62 75 66 66 65 72 20 72  used to buffer r
36d0: 6f 77 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ows..    ** The 
36e0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
36f0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63 6f 64  struction is cod
3700: 65 64 20 6c 61 74 65 72 2c 20 61 66 74 65 72 20  ed later, after 
3710: 69 74 20 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a  it is known how.
3720: 20 20 20 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75      ** many colu
3730: 6d 6e 73 20 74 68 65 20 74 61 62 6c 65 20 77 69  mns the table wi
3740: 6c 6c 20 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20  ll have.  */.   
3750: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20   pMWin->iEphCsr 
3760: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
3770: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 65 6c 65  ;..    rc = sele
3780: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
3790: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
37a0: 69 6e 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  in, p->pEList, &
37b0: 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 69  pSublist);.    i
37c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37d0: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 65 6c 65  c;.    rc = sele
37e0: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
37f0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
3800: 69 6e 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  in, p->pOrderBy,
3810: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
3820: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
3830: 20 72 63 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e   rc;.    pMWin->
3840: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
3850: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
3860: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
3870: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
3880: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3890: 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73 65  e for the sub-se
38a0: 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74 68  lect. This is th
38b0: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a  e concatenation.
38c0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77 69      ** of the wi
38d0: 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20 61  ndow PARTITION a
38e0: 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  nd ORDER BY clau
38f0: 73 65 73 2e 20 41 70 70 65 6e 64 20 74 68 65 20  ses. Append the 
3900: 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 65 78 70  same .    ** exp
3910: 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20  ressions to the 
3920: 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65  sub-select expre
3930: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79  ssion list. They
3940: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
3950: 0a 20 20 20 20 2a 2a 20 66 69 67 75 72 65 20 6f  .    ** figure o
3960: 75 74 20 77 68 65 72 65 20 62 6f 75 6e 64 61 72  ut where boundar
3970: 69 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f  ies for partitio
3980: 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70  ns and sets of p
3990: 65 65 72 20 72 6f 77 73 2e 20 20 2a 2f 0a 20 20  eer rows.  */.  
39a0: 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74 65    pSort = sqlite
39b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
39c0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
39d0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  on, 0);.    if( 
39e0: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20  pMWin->pOrderBy 
39f0: 29 7b 0a 20 20 20 20 20 20 70 53 6f 72 74 20 3d  ){.      pSort =
3a00: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
3a10: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
3a20: 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  t, pMWin->pOrder
3a30: 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  By);.    }.    p
3a40: 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69  Sublist = exprLi
3a50: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
3a60: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
3a70: 53 6f 72 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  Sort);..    /* A
3a80: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
3a90: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 65 61  nts passed to ea
3aa0: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
3ab0: 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  on to the.    **
3ac0: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
3ad0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73  ession list. Als
3ae0: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72  o allocate two r
3af0: 65 67 69 73 74 65 72 73 20 66 6f 72 20 65 61 63  egisters for eac
3b00: 68 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20  h.    ** window 
3b10: 66 75 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66  function - one f
3b20: 6f 72 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  or the accumulat
3b30: 6f 72 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20  or, another for 
3b40: 69 6e 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72  interim.    ** r
3b50: 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
3b60: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
3b70: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
3b80: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
3b90: 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
3ba0: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
3bb0: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
3bc0: 30 29 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69  0);.      pSubli
3bd0: 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  st = exprListApp
3be0: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
3bf0: 70 53 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e  pSublist, pWin->
3c00: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29  pOwner->x.pList)
3c10: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
3c20: 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73  gAccum = ++pPars
3c30: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
3c40: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  Win->regResult =
3c50: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
3c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3c70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
3c80: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
3c90: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a  gAccum);.    }..
3ca0: 20 20 20 20 70 53 75 62 20 3d 20 73 71 6c 69 74      pSub = sqlit
3cb0: 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 20  e3SelectNew(.   
3cc0: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 75       pParse, pSu
3cd0: 62 6c 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68  blist, pSrc, pWh
3ce0: 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  ere, pGroupBy, p
3cf0: 48 61 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30  Having, pSort, 0
3d00: 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  , 0.    );.    p
3d10: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
3d20: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
3d30: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
3d40: 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
3d50: 20 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20       int iTab;. 
3d60: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
3d70: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
3d80: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
3d90: 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20  elect = pSub;.  
3da0: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
3db0: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
3dc0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
3dd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3de0: 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72  te3ExpandSubquer
3df0: 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53  y(pParse, &p->pS
3e00: 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20  rc->a[0]) ){.   
3e10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3e20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
3e30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75  lse{.        pSu
3e40: 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
3e50: 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20  F_Expanded;.    
3e60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
3e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3e80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
3e90: 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  eral, pMWin->iEp
3ea0: 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e  hCsr, pSublist->
3eb0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  nExpr);.  }..  r
3ec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 76 6f 69  eturn rc;.}..voi
3ed0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  d sqlite3WindowD
3ee0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
3ef0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
3f00: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
3f10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3f20: 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b  db, p->pFilter);
3f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
3f40: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3f50: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
3f60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
3f70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
3f80: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
3f90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3fa0: 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20  (db, p->pEnd);. 
3fb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3fc0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61  lete(db, p->pSta
3fd0: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
3fe0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
3ff0: 20 7d 0a 7d 0a 0a 57 69 6e 64 6f 77 20 2a 73 71   }.}..Window *sq
4000: 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63  lite3WindowAlloc
4010: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4020: 65 2c 20 0a 20 20 69 6e 74 20 65 54 79 70 65 2c  e, .  int eType,
4030: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 45  .  int eStart, E
4040: 78 70 72 20 2a 70 53 74 61 72 74 2c 0a 20 20 69  xpr *pStart,.  i
4050: 6e 74 20 65 45 6e 64 2c 20 45 78 70 72 20 2a 70  nt eEnd, Expr *p
4060: 45 6e 64 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20  End.){.  Window 
4070: 2a 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a  *pWin = (Window*
4080: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
4090: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
40a0: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
40b0: 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ;..  if( pWin ){
40c0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65  .    pWin->eType
40d0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 70 57   = eType;.    pW
40e0: 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53 74  in->eStart = eSt
40f0: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
4100: 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 20 20  End = eEnd;.    
4110: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 45 6e  pWin->pEnd = pEn
4120: 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74  d;.    pWin->pSt
4130: 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  art = pStart;.  
4140: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4150: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
4160: 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a  rse->db, pEnd);.
4170: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4180: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4190: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  , pStart);.  }..
41a0: 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d    return pWin;.}
41b0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  ..void sqlite3Wi
41c0: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
41d0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
41e0: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
41f0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
4200: 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b   p->pWin = pWin;
4210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4220: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
4230: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  e(pParse->db, pW
4240: 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  in);.  }.}../*.*
4250: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
4260: 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a  e two window obj
4270: 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63  ects are identic
4280: 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  al, or non-zero 
4290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
42a0: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
42b0: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
42c0: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
42d0: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
42e0: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
42f0: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
4300: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
4310: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
4320: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
4330: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
4340: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
4350: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
4360: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
4370: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
4380: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
4390: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
43a0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
43b0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
43c0: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
43d0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
43e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
43f0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
4400: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
4410: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
4420: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
4430: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
4440: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
4450: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
4460: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
4470: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
4480: 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   0;.}..static vo
4490: 69 64 20 77 69 6e 64 6f 77 41 67 67 49 6e 69 74  id windowAggInit
44a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
44b0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
44c0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
44d0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
44e0: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
44f0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
4500: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
4510: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
4520: 65 29 3b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  e);.    FuncDef 
4530: 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  *p = pWin->pFunc
4540: 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75  ;.    if( (p->fu
4550: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
4560: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26  _FUNC_MINMAX) &&
4570: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
4580: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
4590: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
45a0: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
45b0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
45c0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
45d0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
45e0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
45f0: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
4600: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
4610: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
4620: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
4630: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
4640: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
4650: 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
4660: 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20  >nMem += 3;.    
4670: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26    if( pKeyInfo &
4680: 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  & pWin->pFunc->z
4690: 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a  Name[1]=='i' ){.
46a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
46b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
46c0: 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20  rder[0]==0 );.  
46d0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
46e0: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20  aSortOrder[0] = 
46f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
4700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4710: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
4720: 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73  emeral, pWin->cs
4730: 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20  rApp, 2);.      
4740: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
4750: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
4760: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4780: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
4790: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
47a0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
47b0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 78     else if( p->x
47c0: 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65  SFunc==nth_value
47d0: 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 2d 3e 78  StepFunc || p->x
47e0: 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c  SFunc==first_val
47f0: 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20  ueStepFunc ){.  
4800: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
4810: 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 61 74  two registers at
4820: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20 54   pWin->regApp. T
4830: 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75 73 65  hese will be use
4840: 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 74  d to.      ** st
4850: 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 61 6e  ore the start an
4860: 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66 20 74  d end index of t
4870: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
4880: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
4890: 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  rt( pMWin->iEphC
48a0: 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e  sr );.      pWin
48b0: 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73  ->regApp = pPars
48c0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
48d0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
48e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
48f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
4900: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73  em += 2;.      s
4910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4920: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
4930: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d  pWin->csrApp, pM
4940: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
4950: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
4960: 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61  ( p->xSFunc==lea
4970: 64 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 2d 3e  dStepFunc || p->
4980: 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46  xSFunc==lagStepF
4990: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  unc ){.      ass
49a0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ert( pMWin->iEph
49b0: 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69  Csr );.      pWi
49c0: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
49d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
49e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
49f0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
4a00: 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  p, pWin->csrApp,
4a10: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
4a20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 76  ;.    }.  }.}..v
4a30: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
4a40: 77 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20  wCodeInit(Parse 
4a50: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
4a60: 2a 70 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a  *pWin){.  Vdbe *
4a70: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4a80: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
4a90: 74 20 6e 50 61 72 74 20 3d 20 28 70 57 69 6e 2d  t nPart = (pWin-
4aa0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 57  >pPartition ? pW
4ab0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e  in->pPartition->
4ac0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50  nExpr : 0);.  nP
4ad0: 61 72 74 20 2b 3d 20 28 70 57 69 6e 2d 3e 70 4f  art += (pWin->pO
4ae0: 72 64 65 72 42 79 20 3f 20 70 57 69 6e 2d 3e 70  rderBy ? pWin->p
4af0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
4b00: 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61 72 74   0);.  if( nPart
4b10: 20 29 7b 0a 20 20 20 20 70 57 69 6e 2d 3e 72 65   ){.    pWin->re
4b20: 67 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e  gPart = pParse->
4b30: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
4b40: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72  se->nMem += nPar
4b50: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
4b60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
4b70: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
4b80: 67 50 61 72 74 2c 20 70 57 69 6e 2d 3e 72 65 67  gPart, pWin->reg
4b90: 50 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a 20  Part+nPart-1);. 
4ba0: 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67 49 6e   }.  windowAggIn
4bb0: 69 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29  it(pParse, pWin)
4bc0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4bd0: 20 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d   windowCheckFram
4be0: 65 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  eValue(Parse *pP
4bf0: 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20 69  arse, int reg, i
4c00: 6e 74 20 62 45 6e 64 29 7b 0a 20 20 73 74 61 74  nt bEnd){.  stat
4c10: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
4c20: 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zErr[] = {.    "
4c30: 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f  frame starting o
4c40: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
4c50: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
4c60: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
4c70: 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20  e ending offset 
4c80: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
4c90: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 0a  gative integer".
4ca0: 20 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d    };.  Vdbe *v =
4cb0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
4cc0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
4cd0: 65 67 5a 65 72 6f 20 3d 20 2b 2b 70 50 61 72 73  egZero = ++pPars
4ce0: 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 73 71 6c 69  e->nMem;..  sqli
4cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4d00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
4d10: 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c 69  regZero);.  sqli
4d20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4d30: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
4d40: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
4d50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
4d60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4d70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
4d80: 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33  regZero, sqlite3
4d90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4da0: 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 73 71  v)+2, reg);.  sq
4db0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4dc0: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
4dd0: 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f  TE_ERROR, OE_Abo
4de0: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
4df0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
4e00: 6f 69 64 2a 29 61 7a 45 72 72 5b 62 45 6e 64 5d  oid*)azErr[bEnd]
4e10: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 7d 0a  , P4_STATIC);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4e30: 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b  VM code to invok
4e40: 65 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29  e either xStep()
4e50: 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73   (if bInverse is
4e60: 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65   0) or .** xInve
4e70: 72 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65  rse (if bInverse
4e80: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f   is non-zero) fo
4e90: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
4ea0: 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a  nction in the .*
4eb0: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
4ec0: 61 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e  arting at pMWin.
4ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ee0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20  windowAggStep(. 
4ef0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4f00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
4f10: 2c 20 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20  , .  int csr,.  
4f20: 69 6e 74 20 62 49 6e 76 65 72 73 65 2c 20 0a 20  int bInverse, . 
4f30: 20 69 6e 74 20 72 65 67 2c 0a 20 20 69 6e 74 20   int reg,.  int 
4f40: 72 65 67 50 61 72 74 53 69 7a 65 20 20 20 20 20  regPartSize     
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4f60: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
4f70: 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69  ng size of parti
4f80: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  tion */.){.  Vdb
4f90: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
4fa0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
4fb0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
4fc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
4fd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
4fe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4ff0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 57 69   int flags = pWi
5000: 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  n->pFunc->funcFl
5010: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ags;.    int reg
5020: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
5030: 67 20 3d 20 70 57 69 6e 2d 3e 6e 41 72 67 3b 0a  g = pWin->nArg;.
5040: 0a 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20  .    if( csr>=0 
5050: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
5060: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5070: 3c 70 57 69 6e 2d 3e 6e 41 72 67 3b 20 69 2b 2b  <pWin->nArg; i++
5080: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5090: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
50a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
50b0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c  pWin->iArgCol+i,
50c0: 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d   reg+i);.      }
50d0: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
50e0: 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 66  reg;.      if( f
50f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
5100: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20 29  NC_WINDOW_SIZE )
5110: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  {.        if( nA
5120: 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
5130: 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 50     regArg = regP
5140: 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  artSize;.       
5150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5170: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
5180: 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72 65   regPartSize, re
5190: 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20  g+nArg);.       
51a0: 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67 2b   }.        nArg+
51b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
51c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
51d0: 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53 51  rt( !(flags & SQ
51e0: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
51f0: 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20 20  _SIZE) );.      
5200: 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20 70  regArg = reg + p
5210: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20  Win->iArgCol;.  
5220: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 57    }..    if( (pW
5230: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
5240: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
5250: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
5260: 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72    && pWin->eStar
5270: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
5280: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
5290: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b  ( bInverse==0 ){
52a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
52b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
52c0: 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72  _AddImm, pWin->r
52d0: 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20  egApp+1, 1);.   
52e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
52f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
5300: 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  py, regArg, pWin
5310: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
5320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5330: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5340: 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67  ecord, pWin->reg
5350: 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65  App, 2, pWin->re
5360: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20  gApp+2);.       
5370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5380: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
5390: 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  rt, pWin->csrApp
53a0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
53b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
53c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
53d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
53e0: 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d  OP_SeekGE, pWin-
53f0: 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41  >csrApp, 0, regA
5400: 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rg, 1);.        
5410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5420: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
5430: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
5440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71  beJumpHere(v, sq
5460: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5470: 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20  Addr(v)-2);.    
5480: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
5490: 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29  ( pWin->regApp )
54a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
54b0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46  pWin->pFunc->xSF
54c0: 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74  unc==nth_valueSt
54d0: 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20 20 20  epFunc .        
54e0: 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e     || pWin->pFun
54f0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  c->xSFunc==first
5500: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
5510: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
5520: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
5530: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
5540: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5550: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5560: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
5570: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
5580: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
5590: 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e  e if( pWin->pFun
55a0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
55b0: 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20 20  tepFunc .       
55c0: 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75      || pWin->pFu
55d0: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53  nc->xSFunc==lagS
55e0: 74 65 70 46 75 6e 63 20 0a 20 20 20 20 29 7b 0a  tepFunc .    ){.
55f0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
5600: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
5610: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75     if( pWin->pFu
5620: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
5630: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
5640: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
5650: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5660: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
5670: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
5680: 65 71 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d  eq(pParse, pWin-
5690: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
56a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
56b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
56c0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
56d0: 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28  ollSeq, 0,0,0, (
56e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c  const char*)pCol
56f0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
5700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5720: 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20  v, OP_AggStep0, 
5730: 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67  bInverse, regArg
5740: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
5750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5760: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
5770: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
5780: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
5790: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
57a0: 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
57b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
57c0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
57d0: 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65 20  wAggFinal(Parse 
57e0: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
57f0: 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e  *pMWin, int bFin
5800: 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  al){.  Vdbe *v =
5810: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5820: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
5830: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
5840: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
5850: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
5860: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
5870: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
5880: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
5890: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
58a0: 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74      && pWin->eSt
58b0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
58c0: 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D .    ){.      
58d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58e0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
58f0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
5900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5910: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5920: 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72  _Last, pWin->csr
5930: 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  App);.      sqli
5940: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5950: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e   OP_Column, pWin
5960: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69  ->csrApp, 0, pWi
5970: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
5980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5990: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
59a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
59b0: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
59c0: 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20  if( bFinal ){.  
59d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
59e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
59f0: 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d  setSorter, pWin-
5a00: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
5a10: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
5a20: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
5a30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5a40: 20 69 66 28 20 62 46 69 6e 61 6c 3d 3d 30 20 29   if( bFinal==0 )
5a50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5a60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5a70: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
5a80: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
5a90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5aa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5ab0: 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69  OP_AggFinal, pWi
5ac0: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69  n->regAccum, pWi
5ad0: 6e 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  n->nArg);.      
5ae0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
5af0: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
5b00: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
5b10: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
5b20: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
5b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5b40: 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d  , OP_Copy, pWin-
5b50: 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d  >regAccum, pWin-
5b60: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
5b70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5b90: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 57 69  ngeP3(v, -1, pWi
5ba0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
5bb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5bc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
5bd0: 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43  windowPartitionC
5be0: 61 63 68 65 28 0a 20 20 50 61 72 73 65 20 2a 70  ache(.  Parse *p
5bf0: 50 61 72 73 65 2c 0a 20 20 53 65 6c 65 63 74 20  Parse,.  Select 
5c00: 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p,.  WhereInfo 
5c10: 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72  *pWInfo,.  int r
5c20: 65 67 46 6c 75 73 68 50 61 72 74 2c 0a 20 20 69  egFlushPart,.  i
5c30: 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  nt lblFlushPart,
5c40: 0a 20 20 69 6e 74 20 2a 70 52 65 67 53 69 7a 65  .  int *pRegSize
5c50: 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  .){.  Window *pM
5c60: 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20  Win = p->pWin;. 
5c70: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
5c80: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5c90: 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  );.  Window *pWi
5ca0: 6e 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72  n;.  int iSubCsr
5cb0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
5cc0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  .iCursor;.  int 
5cd0: 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSub = p->pSrc->
5ce0: 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
5cf0: 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74  .  int k;..  int
5d00: 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e   reg = pParse->n
5d10: 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67  Mem+1;.  int reg
5d20: 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75  Record = reg+nSu
5d30: 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  b;.  int regRowi
5d40: 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31 3b  d = regRecord+1;
5d50: 0a 0a 20 20 2a 70 52 65 67 53 69 7a 65 20 3d 20  ..  *pRegSize = 
5d60: 72 65 67 52 6f 77 69 64 3b 0a 20 20 70 50 61 72  regRowid;.  pPar
5d70: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62  se->nMem += nSub
5d80: 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74   + 2;..  /* Mart
5d90: 69 61 6c 20 74 68 65 20 72 6f 77 20 72 65 74 75  ial the row retu
5da0: 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  rned by the sub-
5db0: 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20 61  select into an a
5dc0: 72 72 61 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65  rray of .  ** re
5dd0: 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f  gisters. */.  fo
5de0: 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b  r(k=0; k<nSub; k
5df0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
5e00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5e10: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72  _Column, iSubCsr
5e20: 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d  , k, reg+k);.  }
5e30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5e40: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5e50: 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e 53 75 62  ecord, reg, nSub
5e60: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20  , regRecord);.. 
5e70: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
5e80: 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  s is the start o
5e90: 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f  f a new partitio
5ea0: 6e 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74  n. If so, call t
5eb0: 68 65 0a 20 20 2a 2a 20 66 6c 75 73 68 5f 70 61  he.  ** flush_pa
5ec0: 72 74 69 74 69 6f 6e 20 73 75 62 2d 72 6f 75 74  rtition sub-rout
5ed0: 69 6e 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ine.  */.  if( p
5ee0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
5ef0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
5f00: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
5f10: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
5f20: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69  Partition;.    i
5f30: 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72  nt nPart = (pPar
5f40: 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
5f50: 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
5f60: 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20  egNewPart = reg 
5f70: 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
5f80: 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  Col;.    KeyInfo
5f90: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
5fa0: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
5fb0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5fc0: 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20  pPart, 0, 0);.. 
5fd0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
5fe0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5ff0: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
6000: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
6010: 67 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20  gPart,nPart);.  
6020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
6030: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
6040: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
6050: 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
6060: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6070: 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
6080: 20 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29   addr+4, addr+2)
6090: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
60a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
60b0: 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  py, regNewPart, 
60c0: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
60d0: 6e 50 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71  nPart-1);.    sq
60e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
60f0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
6100: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
6110: 75 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 0a 20  ushPart);.  }.. 
6120: 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
6130: 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
6140: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
6150: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
6160: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6170: 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d  NewRowid, pMWin-
6180: 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77  >iEphCsr, regRow
6190: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
61a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
61b0: 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  nsert, pMWin->iE
61c0: 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64  phCsr, regRecord
61d0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
61e0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69 6e  /* End of the in
61f0: 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71  put loop */.  sq
6200: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
6210: 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76  Info);..  /* Inv
6220: 6f 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69  oke "flush_parti
6230: 74 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77 69  tion" to deal wi
6240: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f 72  th the final (or
6250: 20 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f 6e   only) partition
6260: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
6270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6280: 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
6290: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29  t, lblFlushPart)
62a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
62b0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
62c0: 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Row(.  Parse *pP
62d0: 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a  arse,.  Window *
62e0: 70 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67  pMWin,.  int reg
62f0: 47 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64  Gosub,.  int add
6300: 72 47 6f 73 75 62 0a 29 7b 0a 20 20 56 64 62 65  rGosub.){.  Vdbe
6310: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
6320: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6330: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
6340: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
6350: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
6360: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
6370: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
6380: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
6390: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46    if( pFunc->xSF
63a0: 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74  unc==nth_valueSt
63b0: 65 70 46 75 6e 63 20 0a 20 20 20 20 20 7c 7c 20  epFunc .     || 
63c0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66  pFunc->xSFunc==f
63d0: 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75  irst_valueStepFu
63e0: 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc .    ){.     
63f0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
6400: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69  >csrApp;.      i
6410: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
6420: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6430: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52  ;.      int tmpR
6440: 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
6450: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6470: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
6480: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
6490: 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20  Result);..      
64a0: 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e  if( pFunc->xSFun
64b0: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
64c0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
64d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
64e0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
64f0: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70  pWin->iEphCsr, p
6500: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20  Win->iArgCol+1, 
6510: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  tmpReg);.      }
6520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6540: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
6550: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
6560: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
6570: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6580: 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57  _Add, tmpReg, pW
6590: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52  in->regApp, tmpR
65a0: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
65b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
65c0: 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67  OP_Gt, pWin->reg
65d0: 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52  App+1, lbl, tmpR
65e0: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
65f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6600: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
6610: 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  r, lbl, tmpReg);
6620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6630: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6640: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
6650: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
6660: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
6670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
6680: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
6690: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
66a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
66b0: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
66c0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
66d0: 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e  if( pFunc->xSFun
66e0: 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20  c==leadStepFunc 
66f0: 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  || pFunc->xSFunc
6700: 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 20 29 7b  ==lagStepFunc ){
6710: 0a 20 20 20 20 20 20 69 6e 74 20 69 45 70 68 20  .      int iEph 
6720: 3d 20 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b  = pWin->iEphCsr;
6730: 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d  .      int csr =
6740: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
6750: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
6760: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6770: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
6780: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
6790: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
67a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  rse);..      if(
67b0: 20 70 57 69 6e 2d 3e 6e 41 72 67 3c 33 20 29 7b   pWin->nArg<3 ){
67c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
67d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
67e0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
67f0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
6800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6820: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
6830: 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72   iEph, pWin->iAr
6840: 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65  gCol+2, pWin->re
6850: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
6860: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
6870: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6880: 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70  Rowid, iEph, tmp
6890: 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Reg);.      if( 
68a0: 70 57 69 6e 2d 3e 6e 41 72 67 3c 32 20 29 7b 0a  pWin->nArg<2 ){.
68b0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20          int val 
68c0: 3d 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  = (pFunc->xSFunc
68d0: 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20 3f  ==leadStepFunc ?
68e0: 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20   1 : -1);.      
68f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6900: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
6910: 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a  , tmpReg, val);.
6920: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6930: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70       int op = (p
6940: 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65  Func->xSFunc==le
6950: 61 64 53 74 65 70 46 75 6e 63 20 3f 20 4f 50 5f  adStepFunc ? OP_
6960: 41 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63  Add : OP_Subtrac
6970: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t);.        int 
6980: 74 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65  tmpReg2 = sqlite
6990: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
69a0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
69b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
69c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70  , OP_Column, iEp
69d0: 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  h, pWin->iArgCol
69e0: 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20  +1, tmpReg2);.  
69f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a00: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74  eAddOp3(v, op, t
6a10: 6d 70 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20  mpReg2, tmpReg, 
6a20: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
6a30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6a40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74  empReg(pParse, t
6a50: 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d  mpReg2);.      }
6a60: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
6a70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6a80: 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20  SeekRowid, csr, 
6a90: 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  lbl, tmpReg);.  
6aa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ab0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6ac0: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
6ad0: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
6ae0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
6af0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6b00: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6b20: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6b30: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
6b40: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6b50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b60: 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
6b70: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d  b, addrGosub);.}
6b80: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ..static void wi
6b90: 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a  ndowReturnRows(.
6ba0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6bb0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
6bc0: 2c 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c 0a  ,.  int regCtr,.
6bd0: 20 20 69 6e 74 20 62 46 69 6e 61 6c 2c 0a 20 20    int bFinal,.  
6be0: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20  int regGosub,.  
6bf0: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c 0a 20  int addrGosub,. 
6c00: 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c 0a   int regInvArg,.
6c10: 20 20 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65    int regInvSize
6c20: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  .){.  int addr;.
6c30: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
6c40: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
6c50: 65 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 46  e);.  windowAggF
6c60: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
6c70: 69 6e 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d  in, 0);.  addr =
6c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c90: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6ca0: 72 65 67 43 74 72 2c 20 73 71 6c 69 74 65 33 56  regCtr, sqlite3V
6cb0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6cc0: 29 2b 32 20 2c 31 29 3b 0a 20 20 73 71 6c 69 74  )+2 ,1);.  sqlit
6cd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ce0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
6cf0: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
6d00: 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57  eRow(pParse, pMW
6d10: 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  in, regGosub, ad
6d20: 64 72 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20  drGosub);.  if( 
6d30: 72 65 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20  regInvArg ){.   
6d40: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
6d50: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d  Parse, pMWin, pM
6d60: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c  Win->iEphCsr, 1,
6d70: 20 72 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49   regInvArg, regI
6d80: 6e 76 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73  nvSize);.  }.  s
6d90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6da0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
6db0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64  in->iEphCsr, add
6dc0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
6dd0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
6de0: 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f  r+1);   /* The O
6df0: 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 73 74 61  P_Goto */.}..sta
6e00: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e  tic int windowIn
6e10: 69 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70  itAccum(Parse *p
6e20: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
6e30: 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76  MWin){.  Vdbe *v
6e40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
6e50: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
6e60: 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e   regArg;.  int n
6e70: 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f  Arg = 0;.  Windo
6e80: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
6e90: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
6ea0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
6eb0: 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74  tWin){.    sqlit
6ec0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ed0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
6ee0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
6ef0: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
6f00: 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29 3b 0a 20  , pWin->nArg);. 
6f10: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75     if( pWin->pFu
6f20: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
6f30: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 0a 20 20  valueStepFunc.  
6f40: 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e     || pWin->pFun
6f50: 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  c->xSFunc==first
6f60: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
6f70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
6f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6f90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6fa0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a   pWin->regApp);.
6fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6fc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6fd0: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
6fe0: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d  regApp+1);.    }
6ff0: 0a 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20  .  }.  regArg = 
7000: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
7010: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7020: 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = nArg;.  return
7030: 20 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a   regArg;.}.../*.
7040: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
7050: 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e  <expr1> PRECEDIN
7060: 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f  G AND <expr2> FO
7070: 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 2d 2d 2d 2d 2d  LLOWING.** -----
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
70b0: 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64  **.** Pseudo-cod
70c0: 65 20 66 6f 72 20 74 68 65 20 69 6d 70 6c 65 6d  e for the implem
70d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  entation of this
70e0: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 79   window frame ty
70f0: 70 65 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c  pe is as.** foll
7100: 6f 77 73 2e 20 73 71 6c 69 74 65 33 57 68 65 72  ows. sqlite3Wher
7110: 65 42 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72  eBegin() has alr
7120: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
7130: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
7140: 0a 2a 2a 20 74 6f 70 20 6f 66 20 74 68 65 20 6d  .** top of the m
7150: 61 69 6e 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68  ain loop when th
7160: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
7170: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  alled..**.** Eac
7180: 68 20 74 69 6d 65 20 74 68 65 20 73 75 62 2d 72  h time the sub-r
7190: 6f 75 74 69 6e 65 20 61 74 20 61 64 64 72 47 6f  outine at addrGo
71a0: 73 75 62 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  sub is invoked, 
71b0: 61 20 73 69 6e 67 6c 65 20 6f 75 74 70 75 74 0a  a single output.
71c0: 2a 2a 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61  ** row is genera
71d0: 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
71e0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 64   current row ind
71f0: 69 63 61 74 65 64 20 62 79 20 57 69 6e 64 6f 77  icated by Window
7200: 2e 69 45 70 68 43 73 72 2e 0a 2a 2a 0a 2a 2a 20  .iEphCsr..**.** 
7210: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
7220: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
7230: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
7240: 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72   Gosub flush_par
7250: 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tition.**       
7260: 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
7270: 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68  t (record in eph
7280: 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73  -table).**     s
7290: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
72a0: 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66 6c  .**     Gosub fl
72b0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
72c0: 20 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61    .**   flush_pa
72d0: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
72e0: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
72f0: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
7300: 20 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a 2a   -> csrStart).**
7310: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
7320: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45 6e  iEphCsr -> csrEn
7330: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
7340: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
7350: 78 70 72 31 3e 20 20 20 20 20 20 20 20 20 20 20  xpr1>           
7360: 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49 4e       // PRECEDIN
7370: 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  G expression.** 
7380: 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
7390: 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 20 20  pr2>            
73a0: 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49        // FOLLOWI
73b0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
73c0: 20 20 20 20 20 69 66 28 20 72 65 67 53 74 61 72       if( regStar
73d0: 74 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20  t<0 || regEnd<0 
73e0: 29 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20  ){ error! }.**  
73f0: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
7400: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
7410: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
7420: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
7430: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
7440: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69 70    // if EOF skip
7470: 20 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20 20   Aggstep.**     
7480: 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e    Aggstep (csrEn
7490: 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  d).**       if( 
74a0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
74b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
74c0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
74d0: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
74e0: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
74f0: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
7510: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
7520: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
7530: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
7540: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
7550: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
7560: 41 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72  AggStep (csrStar
7570: 74 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20  t, xInverse).** 
7580: 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63            Next(c
7590: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
75a0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
75b0: 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74  .**   flush_part
75c0: 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20  ition_done:.**  
75d0: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
75e0: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
75f0: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
7600: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
7610: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 43 55  CEDING    AND CU
7620: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57  RRENT ROW.** ROW
7630: 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  S BETWEEN CURREN
7640: 54 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e  T ROW         AN
7650: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
7660: 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  NG.** ROWS BETWE
7670: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
7680: 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
7690: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
76a0: 2a 20 20 20 54 68 65 73 65 20 61 72 65 20 73 69  *   These are si
76b0: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61 62 6f  milar to the abo
76c0: 76 65 2e 20 46 6f 72 20 22 43 55 52 52 45 4e 54  ve. For "CURRENT
76d0: 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c 69 7a 65   ROW", intialize
76e0: 20 74 68 65 0a 2a 2a 20 20 20 72 65 67 69 73 74   the.**   regist
76f0: 65 72 20 74 6f 20 30 2e 20 46 6f 72 20 22 55 4e  er to 0. For "UN
7700: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
7710: 47 22 20 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a  G" to infinity..
7720: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
7730: 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
7740: 49 4e 47 20 20 20 20 41 4e 44 20 55 4e 42 4f 55  ING    AND UNBOU
7750: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
7760: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43  * ROWS BETWEEN C
7770: 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20  URRENT ROW      
7780: 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44     AND UNBOUNDED
7790: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
77a0: 20 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72       Rewind (csr
77b0: 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64  ,csrStart,csrEnd
77c0: 29 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67  )    // if EOF g
77d0: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
77e0: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
77f0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20  while( 1 ){.**  
7800: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
7810: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
7820: 20 20 20 2f 2f 20 45 78 69 74 20 77 68 69 6c 65     // Exit while
7830: 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a 20 20 20  (1) at EOF.**   
7840: 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72      Aggstep (csr
7850: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  End).**     }.**
7860: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
7870: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
7880: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
7890: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
78a0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65  osub.**       Ne
78b0: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
78d0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
78e0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
78f0: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
7900: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
7910: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 53 74  **         AggSt
7920: 65 70 20 28 63 73 72 53 74 61 72 74 2c 20 78 49  ep (csrStart, xI
7930: 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20  nverse).**      
7940: 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74     Next(csrStart
7950: 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  ).**       }.** 
7960: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f      }.**.**   Fo
7970: 72 20 74 68 65 20 22 43 55 52 52 45 4e 54 20 52  r the "CURRENT R
7980: 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  OW AND UNBOUNDED
7990: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 73 65   FOLLOWING" case
79a0: 2c 20 74 68 65 20 66 69 6e 61 6c 20 69 66 28 29  , the final if()
79b0: 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69 6f 6e   .**   condition
79c0: 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 20   is always true 
79d0: 28 61 73 20 69 66 20 72 65 67 53 74 61 72 74 20  (as if regStart 
79e0: 77 65 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  were initialized
79f0: 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41   to 0)..**.** RA
7a00: 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
7a10: 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f  ENT ROW AND UNBO
7a20: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
7a30: 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20 69 73  ** .**   This is
7a40: 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47 45 20   the only RANGE 
7a50: 63 61 73 65 20 68 61 6e 64 6c 65 64 20 62 79 20  case handled by 
7a60: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 49 74  this routine. It
7a70: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 2a 2a   modifies the.**
7a80: 20 20 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28     second while(
7a90: 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22 52 4f   1 ) loop in "RO
7aa0: 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  WS BETWEEN CURRE
7ab0: 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44 45 44  NT ... UNBOUNDED
7ac0: 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62 65 3a  ..." to.**   be:
7ad0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65  .**.**     while
7ae0: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
7af0: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
7b00: 29 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  ).**       while
7b10: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
7b20: 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a 20 20    regPeer++.**  
7b30: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
7b40: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
7b50: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b70: 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66  // if EOF goto f
7b80: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
7b90: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  one.**         i
7ba0: 66 28 20 6e 65 77 20 70 65 65 72 20 29 20 62 72  f( new peer ) br
7bb0: 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  eak;.**       }.
7bc0: 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  **       while( 
7bd0: 28 72 65 67 50 65 65 72 2d 2d 29 3e 30 20 29 7b  (regPeer--)>0 ){
7be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 53  .**         AggS
7bf0: 74 65 70 20 28 63 73 72 53 74 61 72 74 2c 20 78  tep (csrStart, x
7c00: 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20  Inverse).**     
7c10: 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
7c20: 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  t).**       }.**
7c30: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57       }.**.** ROW
7c40: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
7c50: 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20 41 4e   FOLLOWING    AN
7c60: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
7c70: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67 45 6e  NG.**.**   regEn
7c80: 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72 65 67  d = regEnd - reg
7c90: 53 74 61 72 74 0a 2a 2a 20 20 20 52 65 77 69 6e  Start.**   Rewin
7ca0: 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c  d (csr,csrStart,
7cb0: 63 73 72 45 6e 64 29 20 20 20 2f 2f 20 69 66 20  csrEnd)   // if 
7cc0: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
7cd0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
7ce0: 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73       Aggstep (cs
7cf0: 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e 65 78  rEnd).**     Nex
7d00: 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20  t(csrEnd)       
7d10: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
7d20: 45 4f 46 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68  EOF fall-through
7d30: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
7d40: 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  End--)<=0 ){.** 
7d50: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
7d60: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
7d70: 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c          AggFinal
7d80: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
7d90: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
7da0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20  osub.**         
7db0: 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20 20  Next(csr)       
7dc0: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
7dd0: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
7de0: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
7df0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41      }.**       A
7e00: 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72 74  ggStep (csrStart
7e10: 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20  , xInverse).**  
7e20: 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 53 74       Next (csrSt
7e30: 61 72 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  art).**     }.**
7e40: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
7e50: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
7e60: 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20  G    AND <expr> 
7e70: 50 52 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20  PRECEDING.**.** 
7e80: 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 69    Replace the bi
7e90: 74 20 61 66 74 65 72 20 22 52 65 77 69 6e 64 22  t after "Rewind"
7ea0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 77 69   in the above wi
7eb0: 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66  th:.**.**     if
7ec0: 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
7ed0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53  ){.**       AggS
7ee0: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
7ef0: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 45        Next (csrE
7f00: 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  nd).**     }.** 
7f10: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
7f20: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73  alue).**     Gos
7f30: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
7f40: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f60: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
7f70: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
7f80: 6e 65 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72  ne.**     if( (r
7f90: 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
7fa0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
7fb0: 70 20 28 63 73 72 32 2c 20 78 49 6e 76 65 72 73  p (csr2, xInvers
7fc0: 65 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  e).**       Next
7fd0: 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 7d   (csr2).**     }
7fe0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
7ff0: 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77  id windowCodeRow
8000: 45 78 70 72 53 74 65 70 28 0a 20 20 50 61 72 73  ExprStep(.  Pars
8010: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65  e *pParse, .  Se
8020: 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65  lect *p,.  Where
8030: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
8040: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20  int regGosub, . 
8050: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
8060: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  {.  Window *pMWi
8070: 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56  n = p->pWin;.  V
8080: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
8090: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
80a0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
80b0: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20  .  int k;.  int 
80c0: 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSub = p->pSrc->
80d0: 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
80e0: 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50  .  int regFlushP
80f0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
8100: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
8110: 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f  or "Gosub flush_
8120: 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20  partition" */.  
8130: 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  int lblFlushPart
8140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8150: 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f  /* Label for "Go
8160: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
8170: 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ion" */.  int lb
8180: 6c 46 6c 75 73 68 44 6f 6e 65 3b 20 20 20 20 20  lFlushDone;     
8190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
81a0: 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  el for "Gosub fl
81b0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
81c0: 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65  ne" */..  int re
81d0: 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67  gArg;.  int nArg
81e0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
81f0: 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20 70  int csrStart = p
8200: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
8210: 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20 70 50   int csrEnd = pP
8220: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
8230: 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20 20 20  int regStart;   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
8260: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
8270: 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b 20 20  .  int regEnd;  
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
82a0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
82b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 65   */.  int addrNe
82c0: 78 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  xt;.  int addrGo
82d0: 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72 54 6f  to;.  int addrTo
82e0: 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50  p;.  int addrIfP
82f0: 6f 73 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 49  os1;.  int addrI
8300: 66 50 6f 73 32 3b 0a 0a 20 20 69 6e 74 20 72 65  fPos2;..  int re
8310: 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  gPeer = 0;      
8320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8330: 6d 62 65 72 20 6f 66 20 70 65 65 72 73 20 69 6e  mber of peers in
8340: 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 2a   current group *
8350: 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 56  /.  int regPeerV
8360: 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
8370: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
8380: 20 76 61 6c 75 65 73 20 69 64 65 6e 74 69 66 79   values identify
8390: 69 6e 67 20 70 65 65 72 20 67 72 6f 75 70 20 2a  ing peer group *
83a0: 2f 0a 20 20 69 6e 74 20 69 50 65 65 72 20 3d 20  /.  int iPeer = 
83b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
83c0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
83d0: 66 66 73 65 74 20 69 6e 20 65 70 68 2d 74 61 62  ffset in eph-tab
83e0: 6c 65 20 6f 66 20 70 65 65 72 20 76 61 6c 73 20  le of peer vals 
83f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 65 72 56 61  */.  int nPeerVa
8400: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8410: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8420: 6f 66 20 70 65 65 72 20 76 61 6c 75 65 73 20 2a  of peer values *
8430: 2f 0a 20 20 69 6e 74 20 62 52 61 6e 67 65 20 3d  /.  int bRange =
8440: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 53 69 7a   0;.  int regSiz
8450: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
8460: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
8470: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
8480: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
8490: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
84a0: 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NT .       || pM
84b0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
84c0: 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20  FOLLOWING .     
84d0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
84e0: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
84f0: 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
8500: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
8510: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
8520: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
8530: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  d==TK_CURRENT . 
8540: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
8550: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
8560: 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  ED .       || pM
8570: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
8580: 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20  ECEDING .  );.. 
8590: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
85a0: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 0a 20 20 20  e==TK_RANGE .   
85b0: 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  && pMWin->eStart
85c0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
85d0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
85e0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 0a 20 20  =TK_UNBOUNDED.  
85f0: 29 7b 0a 20 20 20 20 62 52 61 6e 67 65 20 3d 20  ){.    bRange = 
8600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  1;.  }..  /* All
8610: 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 20 61  ocate register a
8620: 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  nd label for the
8630: 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f   "flush_partitio
8640: 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20  n" sub-routine. 
8650: 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68 50 61 72  */.  regFlushPar
8660: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
8670: 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61  em;.  lblFlushPa
8680: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
8690: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
86a0: 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d 20 73  lblFlushDone = s
86b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
86c0: 62 65 6c 28 76 29 3b 0a 0a 20 20 72 65 67 53 74  bel(v);..  regSt
86d0: 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  art = ++pParse->
86e0: 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d  nMem;.  regEnd =
86f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
8700: 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74  ..  windowPartit
8710: 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  ionCache(pParse,
8720: 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46   p, pWInfo, regF
8730: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
8740: 73 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65  shPart, &regSize
8750: 29 3b 0a 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d  );..  addrGoto =
8760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8770: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
8780: 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22  .  /* Start of "
8790: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
87a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
87b0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
87c0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a   lblFlushPart);.
87d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
87e0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op2(v, OP_Once, 
87f0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
8800: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
8810: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8820: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
8830: 75 70 2c 20 63 73 72 53 74 61 72 74 2c 20 70 4d  up, csrStart, pM
8840: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8860: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
8870: 2c 20 63 73 72 45 6e 64 2c 20 70 4d 57 69 6e 2d  , csrEnd, pMWin-
8880: 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f 2a  >iEphCsr);..  /*
8890: 20 49 66 20 65 69 74 68 65 72 20 72 65 67 53 74   If either regSt
88a0: 61 72 74 20 6f 72 20 72 65 67 45 6e 64 20 61 72  art or regEnd ar
88b0: 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65 67 61 74 69  e not non-negati
88c0: 76 65 20 69 6e 74 65 67 65 72 73 2c 20 74 68 72  ve integers, thr
88d0: 6f 77 20 0a 20 20 2a 2a 20 61 6e 20 65 78 63 65  ow .  ** an exce
88e0: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  ption.  */.  if(
88f0: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 29   pMWin->pStart )
8900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
8910: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d  rCode(pParse, pM
8920: 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65 67  Win->pStart, reg
8930: 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e 64  Start);.    wind
8940: 6f 77 43 68 65 63 6b 46 72 61 6d 65 56 61 6c 75  owCheckFrameValu
8950: 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61  e(pParse, regSta
8960: 72 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  rt, 0);.  }.  if
8970: 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 29 7b  ( pMWin->pEnd ){
8980: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8990: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
89a0: 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
89b0: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
89c0: 63 6b 46 72 61 6d 65 56 61 6c 75 65 28 70 50 61  ckFrameValue(pPa
89d0: 72 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b  rse, regEnd, 1);
89e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
89f0: 69 73 20 69 73 20 22 52 4f 57 53 20 3c 65 78 70  is is "ROWS <exp
8a00: 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
8a10: 44 20 52 4f 57 53 20 3c 65 78 70 72 32 3e 20 46  D ROWS <expr2> F
8a20: 4f 4c 4c 4f 57 49 4e 47 22 2c 20 64 6f 3a 0a 20  OLLOWING", do:. 
8a30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 72 65 67 45 6e   **.  **   regEn
8a40: 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72 65 67  d = regEnd - reg
8a50: 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20 20 69 66  Start;.  */.  if
8a60: 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26  ( pMWin->pEnd &&
8a70: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 26   pMWin->pStart &
8a80: 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  & pMWin->eStart=
8a90: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
8aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
8ab0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
8ac0: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71  LOWING );.    sq
8ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8ae0: 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
8af0: 72 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64  regStart, regEnd
8b00: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a  , regEnd);.  }..
8b10: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
8b20: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
8b30: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
8b40: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
8b50: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
8b60: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
8b70: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
8b80: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
8b90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8ba0: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
8bb0: 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c  ->iEphCsr, lblFl
8bc0: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  ushDone);.  sqli
8bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8be0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53   OP_Rewind, csrS
8bf0: 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  tart, lblFlushDo
8c00: 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne);.  sqlite3Vd
8c10: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
8c20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
8c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
8c40: 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46  nd, csrEnd, lblF
8c50: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c  lushDone);.  sql
8c60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8c70: 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e  (v, 1);..  /* In
8c80: 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75 6e  voke AggStep fun
8c90: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77  ction for each w
8ca0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75  indow function u
8cb0: 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68 61  sing the row tha
8cc0: 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63 75  t.  ** csrEnd cu
8cd0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
8ce0: 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e 64  o. Or, if csrEnd
8cf0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
8d00: 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68  OF,.  ** do noth
8d10: 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54  ing.  */.  addrT
8d20: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
8d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8d40: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
8d50: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
8d60: 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73  ){.    addrIfPos
8d70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
8d80: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
8d90: 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31  s, regEnd, 0 , 1
8da0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8dc0: 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73  _Next, csrEnd, s
8dd0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
8de0: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 61  tAddr(v)+2);.  a
8df0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
8e00: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
8e10: 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67  to);.  windowAgg
8e20: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
8e30: 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72  in, csrEnd, 0, r
8e40: 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b  egArg, regSize);
8e50: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
8e60: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
8e70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8e80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8e90: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
8ea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8eb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
8ec0: 64 72 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70  dr);.    addrTop
8ed0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
8ee0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
8ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8f00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8f10: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
8f20: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
8f30: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
8f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
8f50: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
8f60: 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20  fPos1);.    }.  
8f70: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
8f80: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
8f90: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
8fa0: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
8fb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
8fc0: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
8fd0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
8fe0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
8ff0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
9000: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
9010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9020: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
9030: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
9040: 0a 20 20 7d 0a 20 20 69 66 28 20 62 52 61 6e 67  .  }.  if( bRang
9050: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
9060: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
9070: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
9080: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  Win->pOrderBy );
9090: 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d 20 2b  .    regPeer = +
90a0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
90b0: 20 20 20 72 65 67 50 65 65 72 56 61 6c 20 3d 20     regPeerVal = 
90c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
90d0: 20 20 20 20 69 50 65 65 72 20 3d 20 70 4d 57 69      iPeer = pMWi
90e0: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20  n->nBufferCol + 
90f0: 28 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69  (pMWin->pPartiti
9100: 6f 6e 3f 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  on?pMWin->pParti
9110: 74 69 6f 6e 2d 3e 6e 45 78 70 72 3a 30 29 3b 0a  tion->nExpr:0);.
9120: 20 20 20 20 6e 50 65 65 72 56 61 6c 20 3d 20 70      nPeerVal = p
9130: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
9140: 6e 45 78 70 72 3b 0a 20 20 20 20 70 50 61 72 73  nExpr;.    pPars
9150: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 32 20 2a 20  e->nMem += (2 * 
9160: 6e 50 65 65 72 56 61 6c 29 3b 0a 20 20 20 20 66  nPeerVal);.    f
9170: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 56  or(k=0; k<nPeerV
9180: 61 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  al; k++){.      
9190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
91a0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
91b0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
91c0: 69 50 65 65 72 2b 6b 2c 20 72 65 67 50 65 65 72  iPeer+k, regPeer
91d0: 56 61 6c 2b 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Val+k);.    }.  
91e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
91f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9200: 72 2c 20 30 2c 20 72 65 67 50 65 65 72 29 3b 0a  r, 0, regPeer);.
9210: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67    }..  windowAgg
9220: 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d  Final(pParse, pM
9230: 57 69 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 62  Win, 0);.  if( b
9240: 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  Range ){.    sql
9250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9260: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67  , OP_AddImm, reg
9270: 50 65 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  Peer, 1);.  }.  
9280: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
9290: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
92a0: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
92b0: 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65  Gosub);.  sqlite
92c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
92d0: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
92e0: 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56  EphCsr, sqlite3V
92f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9300: 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+2);.  sqlite3V
9310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9320: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75 73  Goto, 0, lblFlus
9330: 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 62 52  hDone);.  if( bR
9340: 61 6e 67 65 20 29 7b 0a 20 20 20 20 4b 65 79 49  ange ){.    KeyI
9350: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
9360: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
9370: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
9380: 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  e, pMWin->pOrder
9390: 42 79 2c 30 2c 30 29 3b 0a 20 20 20 20 69 6e 74  By,0,0);.    int
93a0: 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
93b0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
93c0: 64 72 28 76 29 2d 34 3b 0a 20 20 20 20 66 6f 72  dr(v)-4;.    for
93d0: 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 56 61 6c  (k=0; k<nPeerVal
93e0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; k++){.      in
93f0: 74 20 69 4f 75 74 20 3d 20 72 65 67 50 65 65 72  t iOut = regPeer
9400: 56 61 6c 20 2b 20 6e 50 65 65 72 56 61 6c 20 2b  Val + nPeerVal +
9410: 20 6b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   k;.      sqlite
9420: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9430: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
9440: 3e 69 45 70 68 43 73 72 2c 20 69 50 65 65 72 2b  >iEphCsr, iPeer+
9450: 6b 2c 20 69 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  k, iOut);.    }.
9460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9470: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
9480: 61 72 65 2c 20 72 65 67 50 65 65 72 56 61 6c 2c  are, regPeerVal,
9490: 20 72 65 67 50 65 65 72 56 61 6c 2b 6e 50 65 65   regPeerVal+nPee
94a0: 72 56 61 6c 2c 20 6e 50 65 65 72 56 61 6c 29 3b  rVal, nPeerVal);
94b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
94c0: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
94d0: 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
94e0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 61 64  KEYINFO);.    ad
94f0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
9500: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
9510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9520: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
9530: 6d 70 2c 20 61 64 64 72 2c 20 61 64 64 72 4a 75  mp, addr, addrJu
9540: 6d 70 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20  mp, addr);.  }. 
9550: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
9560: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
9570: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
9580: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
9590: 64 64 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a  ddrIfPos2);.  }.
95a0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
95b0: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
95c0: 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65   .   || pMWin->e
95d0: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
95e0: 49 4e 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e  ING .   || pMWin
95f0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
9600: 4c 4f 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20  LOWING .  ){.   
9610: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 48 65 72   int addrJumpHer
9620: 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
9630: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
9640: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
9650: 20 20 20 20 61 64 64 72 4a 75 6d 70 48 65 72 65      addrJumpHere
9660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9670: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
9680: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20  , regStart, 0 , 
9690: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
96a0: 28 20 62 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( bRange ){.    
96b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
96c0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
96d0: 20 72 65 67 50 65 65 72 2c 20 73 71 6c 69 74 65   regPeer, sqlite
96e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
96f0: 28 76 29 2b 32 2c 20 31 29 3b 0a 20 20 20 20 20  (v)+2, 1);.     
9700: 20 61 64 64 72 4a 75 6d 70 48 65 72 65 20 3d 20   addrJumpHere = 
9710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9720: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
9730: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9740: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9750: 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c  _Next, csrStart,
9760: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9770: 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20  entAddr(v)+1);. 
9780: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
9790: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
97a0: 63 73 72 53 74 61 72 74 2c 20 31 2c 20 72 65 67  csrStart, 1, reg
97b0: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
97c0: 20 20 20 69 66 28 20 62 52 61 6e 67 65 20 29 7b     if( bRange ){
97d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
97e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
97f0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4a 75 6d 70  oto, 0, addrJump
9800: 48 65 72 65 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  Here-1);.    }. 
9810: 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 48     if( addrJumpH
9820: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ere ){.      sql
9830: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
9840: 28 76 2c 20 61 64 64 72 4a 75 6d 70 48 65 72 65  (v, addrJumpHere
9850: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9860: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
9870: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
9880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
9890: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
98a0: 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71  fPos1);.  }.  sq
98b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
98c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
98d0: 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66  ddrTop);..  /* f
98e0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
98f0: 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65  one: */.  sqlite
9900: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
9910: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  l(v, lblFlushDon
9920: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
9930: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
9940: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
9950: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71  ->iEphCsr);.  sq
9960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
9970: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
9980: 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20  gFlushPart);..  
9990: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
99a0: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
99b0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
99c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
99d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
99e0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e  o);.}../*.** RAN
99f0: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
9a00: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
9a10: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
9a20: 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72  *.**   flush_par
9a30: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
9a40: 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
9a50: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
9a60: 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  -> csrLead).**  
9a70: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 74 65     }.**     Inte
9a80: 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20  ger ctr 0.**    
9a90: 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73   foreach row (cs
9aa0: 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20  rLead){.**      
9ab0: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
9ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
9ad0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
9ae0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
9af0: 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
9b00: 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  *           Gosu
9b10: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
9b20: 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45           Next iE
9b30: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20  phCsr.**        
9b40: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e   }.**         In
9b50: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
9b60: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
9b70: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
9b80: 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20  ).**       Incr 
9b90: 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  ctr.**     }.**.
9ba0: 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20  **     AggFinal 
9bb0: 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
9bc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
9bd0: 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
9be0: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
9bf0: 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20  b.**       Next 
9c00: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d  iEphCsr.**     }
9c10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74  .**.**     Reset
9c20: 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20  Sorter (csr).** 
9c30: 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a      Return.**.**
9c40: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
9c50: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
9c60: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
9c70: 57 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  W.** RANGE BETWE
9c80: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
9c90: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
9ca0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
9cb0: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
9cc0: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
9cd0: 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a  CURRENT ROW .**.
9ce0: 2a 2a 20 20 20 54 4f 44 4f 2e 0a 2a 2f 0a 73 74  **   TODO..*/.st
9cf0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
9d00: 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 0a 20  CodeCacheStep(. 
9d10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9d20: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20  .  Select *p,.  
9d30: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
9d40: 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  o,.  int regGosu
9d50: 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  b, .  int addrGo
9d60: 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20  sub.){.  Window 
9d70: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
9d80: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
9d90: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9da0: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
9db0: 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  pWin;.  int k;. 
9dc0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70   int addr;.  Exp
9dd0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
9de0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
9df0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
9e00: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
9e10: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
9e20: 6e 50 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79  nPeer = pOrderBy
9e30: 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72  ->nExpr;.  int r
9e40: 65 67 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e  egNewPeer;..  in
9e50: 74 20 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20  t addrGoto;     
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e70: 20 41 64 64 72 65 73 73 20 6f 66 20 47 6f 74 6f   Address of Goto
9e80: 20 75 73 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c   used to jump fl
9e90: 75 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69  ush_par.. */.  i
9ea0: 6e 74 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20  nt addrRewind;  
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ec0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 52 65 77  * Address of Rew
9ed0: 69 6e 64 20 74 68 61 74 20 73 74 61 72 74 73 20  ind that starts 
9ee0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  loop */.  int re
9ef0: 67 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e  gFlushPart;.  in
9f00: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a  t lblFlushPart;.
9f10: 20 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20    int csrLead;. 
9f20: 20 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69   int regCtr;.  i
9f30: 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20 20 20  nt regArg;      
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f50: 2a 20 52 65 67 69 73 74 65 72 20 61 72 72 61 79  * Register array
9f60: 20 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63   to martial func
9f70: 74 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69  tion args */.  i
9f80: 6e 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e  nt regSize;.  in
9f90: 74 20 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65 72  t nArg;..  asser
9fa0: 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  t( (pMWin->eStar
9fb0: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
9fc0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
9fd0: 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20  TK_CURRENT) .   
9fe0: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
9ff0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
a000: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
a010: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
a020: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
a030: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
a040: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
a050: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
a060: 4e 54 29 20 0a 20 20 29 3b 0a 0a 20 20 72 65 67  NT) .  );..  reg
a070: 4e 65 77 50 65 65 72 20 3d 20 70 50 61 72 73 65  NewPeer = pParse
a080: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72  ->nMem+1;.  pPar
a090: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65  se->nMem += nPee
a0a0: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
a0b0: 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c  e register and l
a0c0: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c  abel for the "fl
a0d0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73  ush_partition" s
a0e0: 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  ub-routine. */. 
a0f0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20   regFlushPart = 
a100: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a110: 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d    lblFlushPart =
a120: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
a130: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72  Label(v);..  csr
a140: 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Lead = pParse->n
a150: 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20  Tab++;.  regCtr 
a160: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a170: 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69  ;..  windowParti
a180: 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65  tionCache(pParse
a190: 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
a1a0: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
a1b0: 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a  ushPart, &regSiz
a1c0: 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d  e);.  addrGoto =
a1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a1e0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
a1f0: 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22  .  /* Start of "
a200: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
a210: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
a220: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a230: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a   lblFlushPart);.
a240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a250: 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op2(v, OP_Once, 
a260: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
a270: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
a280: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a290: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
a2a0: 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57  up, csrLead, pMW
a2b0: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20  in->iEphCsr);.. 
a2c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
a2d0: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
a2e0: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
a2f0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
a300: 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65   to NULL */.  re
a310: 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69  gArg = windowIni
a320: 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70  tAccum(pParse, p
a330: 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65  MWin);..  sqlite
a340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a350: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
a360: 67 43 74 72 29 3b 0a 20 20 61 64 64 72 52 65 77  gCtr);.  addrRew
a370: 69 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ind = sqlite3Vdb
a380: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
a390: 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 29 3b 0a  wind, csrLead);.
a3a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a3b0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
a3c0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
a3d0: 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
a3e0: 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  By && pMWin->eEn
a3f0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b  d==TK_CURRENT ){
a400: 0a 20 20 20 20 69 6e 74 20 62 43 75 72 72 65 6e  .    int bCurren
a410: 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64  t = (pMWin->eEnd
a420: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
a430: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
a440: 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20  K_CURRENT);.    
a450: 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
a460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a470: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a   Address of OP_J
a480: 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ump below */.   
a490: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
a4a0: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
a4b0: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
a4c0: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
a4d0: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
a4e0: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
a4f0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
a500: 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
a510: 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  rt + (pPart ? pP
a520: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
a530: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
a540: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
a550: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
a560: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
a570: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
a580: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
a590: 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nPeer; k++){.   
a5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a5b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a5c0: 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f  umn, csrLead, iO
a5d0: 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72  ff+k, regNewPeer
a5e0: 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +k);.      }.   
a5f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a600: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a610: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
a620: 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
a630: 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
a640: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
a650: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
a660: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
a670: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d  );.      addrJum
a680: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
a690: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
a6a0: 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
a6b0: 72 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+2);.      sqli
a6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a6d0: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77   OP_Copy, regNew
a6e0: 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e  Peer, regPeer, n
a6f0: 50 65 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  Peer-1);.    }..
a700: 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e      windowReturn
a710: 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57  Rows(pParse, pMW
a720: 69 6e 2c 20 72 65 67 43 74 72 2c 20 30 2c 20 72  in, regCtr, 0, r
a730: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
a740: 75 62 2c 20 0a 20 20 20 20 20 20 20 20 28 62 43  ub, .        (bC
a750: 75 72 72 65 6e 74 20 3f 20 72 65 67 41 72 67 20  urrent ? regArg 
a760: 3a 20 30 29 2c 20 28 62 43 75 72 72 65 6e 74 20  : 0), (bCurrent 
a770: 3f 20 72 65 67 53 69 7a 65 20 3a 20 30 29 0a 20  ? regSize : 0). 
a780: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 64     );.    if( ad
a790: 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33  drJump ) sqlite3
a7a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a7b0: 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a  addrJump);.  }..
a7c0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
a7d0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
a7e0: 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72  srLead, 0, regAr
a7f0: 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 73  g, regSize);.  s
a800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a810: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
a820: 65 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c  egCtr, 1);.  sql
a830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a840: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65  , OP_Next, csrLe
a850: 61 64 2c 20 61 64 64 72 52 65 77 69 6e 64 2b 32  ad, addrRewind+2
a860: 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75  );..  windowRetu
a870: 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70  rnRows(pParse, p
a880: 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 31 2c  MWin, regCtr, 1,
a890: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
a8a0: 6f 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  osub, 0, 0);..  
a8b0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a8c0: 65 72 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e  ere(v, addrRewin
a8d0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
a8e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
a8f0: 72 52 65 77 69 6e 64 2b 31 29 3b 0a 20 20 73 71  rRewind+1);.  sq
a900: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a910: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
a920: 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  r, pMWin->iEphCs
a930: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
a940: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
a950: 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61  turn, regFlushPa
a960: 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rt);..  /* Jump 
a970: 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  to here to skip 
a980: 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69  over flush_parti
a990: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
a9a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a9b0: 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a   addrGoto);.}...
a9c0: 2f 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  /*.** RANGE BETW
a9d0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
a9e0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
a9f0: 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  ENT ROW.**.**   
aa00: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e  ....**     if( n
aa10: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
aa20: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
aa30: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
aa40: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
aa50: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
aa60: 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d  ResetSorter eph-
aa70: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a  table.**     }.*
aa80: 2a 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  *     else if( n
aa90: 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20  ew peer ){.**   
aaa0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
aab0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47  alue).**       G
aac0: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
aad0: 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72  *       ResetSor
aae0: 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a  ter eph-table.**
aaf0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67       }.**     Ag
ab00: 67 53 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73  gStep.**     Ins
ab10: 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f  ert (record into
ab20: 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20   eph-table).**  
ab30: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
ab40: 28 29 0a 2a 2a 20 20 20 41 67 67 46 69 6e 61 6c  ().**   AggFinal
ab50: 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
ab60: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
ab70: 62 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  b.**.** RANGE BE
ab80: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
ab90: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
aba0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
abb0: 47 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f  G.**.**   As abo
abc0: 76 65 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20  ve, except take 
abd0: 6e 6f 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20  no action for a 
abe0: 22 6e 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f  "new peer". Invo
abf0: 6b 65 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d  ke.**   the sub-
ac00: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c  routine once onl
ac10: 79 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69  y for each parti
ac20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47  tion..**.** RANG
ac30: 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
ac40: 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e  T ROW AND CURREN
ac50: 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73  T ROW.**.**   As
ac60: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
ac70: 68 61 74 20 74 68 65 20 22 6e 65 77 20 70 65 65  hat the "new pee
ac80: 72 22 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  r" condition is 
ac90: 68 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a  handled in the.*
aca0: 2a 20 20 20 73 61 6d 65 20 77 61 79 20 61 73 20  *   same way as 
acb0: 22 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20  "new partition" 
acc0: 28 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (so there is no 
acd0: 22 65 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29  "else if" block)
ace0: 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  ..**.** ROWS BET
acf0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
ad00: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
ad10: 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 0a 2a 2a 20  RENT ROW.** .** 
ad20: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
ad30: 70 74 20 61 73 73 75 6d 65 20 65 76 65 72 79 20  pt assume every 
ad40: 72 6f 77 20 69 73 20 61 20 22 6e 65 77 20 70 65  row is a "new pe
ad50: 65 72 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  er"..*/.static v
ad60: 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 44 65  oid windowCodeDe
ad70: 66 61 75 6c 74 53 74 65 70 28 0a 20 20 50 61 72  faultStep(.  Par
ad80: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
ad90: 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72  elect *p,.  Wher
ada0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
adb0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a   int regGosub, .
adc0: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a    int addrGosub.
add0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
ade0: 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
adf0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ae00: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ae10: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
ae20: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74  ;.  int k;.  int
ae30: 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53   iSubCsr = p->pS
ae40: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
ae50: 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70  ;.  int nSub = p
ae60: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
ae70: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72  b->nCol;.  int r
ae80: 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
ae90: 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  m+1;.  int regRe
aea0: 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b  cord = reg+nSub;
aeb0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20  .  int regRowid 
aec0: 3d 20 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20  = regRecord+1;. 
aed0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70   int addr;.  Exp
aee0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
aef0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
af00: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
af10: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
af20: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 61 73 73  pOrderBy;..  ass
af30: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70  ert( pMWin->eTyp
af40: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 0a 20 20 20  e==TK_RANGE .   
af50: 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
af60: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
af70: 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  ED && pMWin->eEn
af80: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20  d==TK_CURRENT). 
af90: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28   );..  assert( (
afa0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
afb0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
afc0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
afd0: 55 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c  URRENT).       |
afe0: 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  | (pMWin->eStart
aff0: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26  ==TK_UNBOUNDED &
b000: 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
b010: 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20  K_UNBOUNDED).   
b020: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
b030: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
b040: 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
b050: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
b060: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
b070: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
b080: 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  NT && pMWin->eEn
b090: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
b0a0: 26 26 20 21 70 4f 72 64 65 72 42 79 29 0a 20 20  && !pOrderBy).  
b0b0: 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  );..  if( pMWin-
b0c0: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
b0d0: 44 45 44 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  DED ){.    pOrde
b0e0: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
b0f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
b100: 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20  nSub + 2;..  /* 
b110: 4d 61 72 74 69 61 6c 20 74 68 65 20 72 6f 77 20  Martial the row 
b120: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
b130: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20  sub-select into 
b140: 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 20 20 2a  an array of .  *
b150: 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  * registers. */.
b160: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75    for(k=0; k<nSu
b170: 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  b; k++){.    sql
b180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b190: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75  , OP_Column, iSu
b1a0: 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b  bCsr, k, reg+k);
b1b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
b1c0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
b1d0: 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
b1e0: 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65 65 72  artition or peer
b1f0: 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69 66 28   group. */.  if(
b200: 20 70 50 61 72 74 20 7c 7c 20 70 4f 72 64 65 72   pPart || pOrder
b210: 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  By ){.    int nP
b220: 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f 20 70  art = (pPart ? p
b230: 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  Part->nExpr : 0)
b240: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f  ;.    int addrGo
b250: 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  to = 0;.    int 
b260: 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20 20  addrJump = 0;.  
b270: 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70    int nPeer = (p
b280: 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
b290: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
b2a0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 74 20 29  .    if( pPart )
b2b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e  {.      int regN
b2c0: 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70  ewPart = reg + p
b2d0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
b2e0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
b2f0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
b300: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
b310: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
b320: 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Part, 0, 0);.   
b330: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
b340: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b350: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
b360: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
b370: 67 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20  gPart,nPart);.  
b380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b390: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
b3a0: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
b3b0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61  EYINFO);.      a
b3c0: 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  ddrJump = sqlite
b3d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b3e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
b3f0: 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  0, addr+2);.    
b400: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
b410: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
b420: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
b430: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
b440: 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
b450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b460: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
b470: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
b480: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
b490: 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50       int regNewP
b4a0: 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  eer = reg + pMWi
b4b0: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20  n->nBufferCol + 
b4c0: 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  nPart;.      int
b4d0: 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e   regPeer = pMWin
b4e0: 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72  ->regPart + nPar
b4f0: 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64  t;..      if( ad
b500: 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33  drJump ) sqlite3
b510: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b520: 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20  addrJump);.     
b530: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
b540: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
b550: 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
b560: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
b570: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
b580: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
b590: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
b5a0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
b5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b5c0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
b5d0: 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
b5e0: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
b5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b600: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
b610: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
b620: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
b630: 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
b640: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b650: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
b660: 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
b670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b680: 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b     addrJump = 0;
b690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
b6a0: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
b6b0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57  arse, pMWin, pMW
b6c0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
b6d0: 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 20 20 69  URRENT);.      i
b6e0: 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71  f( addrGoto ) sq
b6f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b700: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
b710: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
b720: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b730: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
b740: 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65  ->iEphCsr,sqlite
b750: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b760: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
b770: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b780: 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f   OP_Gosub, regGo
b790: 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
b7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b7b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
b7c0: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
b7d0: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
b7e0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
b7f0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
b800: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
b810: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
b820: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
b830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b840: 33 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50  3(.        v, OP
b850: 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e  _Copy, reg+pMWin
b860: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d  ->nBufferCol, pM
b870: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50  Win->regPart, nP
b880: 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20  art+nPeer-1.    
b890: 29 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72  );..    if( addr
b8a0: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
b8b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b8c0: 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
b8d0: 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66  /* Invoke step f
b8e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64  unction for wind
b8f0: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
b900: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
b910: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d  pParse, pMWin, -
b920: 31 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a  1, 0, reg, 0);..
b930: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20    /* Buffer the 
b940: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74  current row in t
b950: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
b960: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  le. */.  if( pMW
b970: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30  in->nBufferCol>0
b980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b990: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b9a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
b9b0: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
b9c0: 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
b9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b9e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b9f0: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65  , OP_Blob, 0, re
ba00: 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71  gRecord);.    sq
ba10: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
ba20: 34 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20  4(v, (void*)"", 
ba30: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
ba40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ba50: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
ba60: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
ba70: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
ba80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ba90: 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
baa0: 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
bab0: 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
bac0: 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
bad0: 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
bae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
baf0: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
bb00: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
bb10: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
bb20: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
bb30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
bb40: 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
bb50: 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65  hCsr,sqlite3Vdbe
bb60: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
bb70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
bb80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
bb90: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
bba0: 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69  drGosub);.  sqli
bbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bbc0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
bbd0: 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65  >iEphCsr, sqlite
bbe0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
bbf0: 28 76 29 2d 31 29 3b 0a 7d 0a 0a 57 69 6e 64 6f  (v)-1);.}..Windo
bc00: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
bc10: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bc20: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
bc30: 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b  indow *pNew = 0;
bc40: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
bc50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
bc60: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
bc70: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
bc80: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
bc90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c        pNew->pFil
bca0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ter = sqlite3Exp
bcb0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c  rDup(db, p->pFil
bcc0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ter, 0);.      p
bcd0: 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  New->pPartition 
bce0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
bcf0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72  tDup(db, p->pPar
bd00: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
bd10: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
bd20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bd30: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
bd40: 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  derBy, 0);.     
bd50: 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70   pNew->eType = p
bd60: 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  ->eType;.      p
bd70: 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  New->eEnd = p->e
bd80: 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  End;.      pNew-
bd90: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
bda0: 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  art;.      pNew-
bdb0: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
bdc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
bdd0: 77 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  w->pStart, 0);. 
bde0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
bdf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
be00: 28 64 62 2c 20 70 4e 65 77 2d 3e 70 45 6e 64 2c  (db, pNew->pEnd,
be10: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
be20: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
be30: 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  ./*.** RANGE BET
be40: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
be50: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42  RECEDING AND UNB
be60: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
be70: 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  .**.**   As abov
be80: 65 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e  e, except take n
be90: 6f 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22  o action for a "
bea0: 6e 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b  new peer". Invok
beb0: 65 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72  e.**   the sub-r
bec0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79  outine once only
bed0: 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74   for each partit
bee0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ion..**.** RANGE
bef0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
bf00: 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
bf10: 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20   ROW.**.**   As 
bf20: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
bf30: 61 74 20 74 68 65 20 22 6e 65 77 20 70 65 65 72  at the "new peer
bf40: 22 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68  " condition is h
bf50: 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a  andled in the.**
bf60: 20 20 20 73 61 6d 65 20 77 61 79 20 61 73 20 22     same way as "
bf70: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28  new partition" (
bf80: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  so there is no "
bf90: 65 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e  else if" block).
bfa0: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
bfb0: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
bfc0: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
bfd0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
bfe0: 20 4f 6e 65 20 77 61 79 20 69 73 20 74 6f 20 6a   One way is to j
bff0: 75 73 74 20 72 65 76 65 72 73 65 20 74 68 65 20  ust reverse the 
c000: 73 6f 72 74 20 6f 72 64 65 72 20 61 6e 64 20 64  sort order and d
c010: 6f 20 61 73 20 66 6f 72 20 42 45 54 57 45 45 4e  o as for BETWEEN
c020: 20 0a 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44   .**   UNBOUNDED
c030: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
c040: 55 52 52 45 4e 54 20 52 4f 57 2e 20 42 75 74 20  URRENT ROW. But 
c050: 74 68 61 74 20 69 73 20 6e 6f 74 20 71 75 69 74  that is not quit
c060: 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 0a 2a  e the same for.*
c070: 2a 20 20 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  *   things like 
c080: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 2e 20  group_concat(). 
c090: 41 6e 64 20 70 65 72 68 61 70 73 20 6f 74 68 65  And perhaps othe
c0a0: 72 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 61  r user defined a
c0b0: 67 67 72 65 67 61 74 65 73 20 0a 2a 2a 20 20 20  ggregates .**   
c0c0: 61 73 20 77 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 20  as well..**.**  
c0d0: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20   ....**     if( 
c0e0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b  new partition ){
c0f0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
c100: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3b  flush_partition;
c110: 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53  .**       ResetS
c120: 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a  orter eph-table.
c130: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
c140: 41 67 67 53 74 65 70 0a 2a 2a 20 20 20 20 20 49  AggStep.**     I
c150: 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e  nsert (record in
c160: 74 6f 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a  to eph-table).**
c170: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
c180: 6e 64 28 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20  nd().**   Gosub 
c190: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a  flush_partition.
c1a0: 2a 2a 0a 2a 2a 20 20 66 6c 75 73 68 5f 70 61 72  **.**  flush_par
c1b0: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 4f 70 65  tition:.**   Ope
c1c0: 6e 44 75 70 20 28 63 73 72 20 2d 3e 20 63 73 72  nDup (csr -> csr
c1d0: 32 29 0a 2a 2a 20 20 20 66 6f 72 65 61 63 68 20  2).**   foreach 
c1e0: 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74  (record in eph-t
c1f0: 61 62 6c 65 29 20 7b 0a 2a 2a 20 20 20 20 20 69  able) {.**     i
c200: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
c210: 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  *       while( c
c220: 73 72 32 21 3d 63 73 72 20 29 7b 0a 2a 2a 20 20  sr2!=csr ){.**  
c230: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
c240: 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20  xInverse).**    
c250: 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32 29       Next (csr2)
c260: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c270: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46     }.**     AggF
c280: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
c290: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
c2a0: 6f 73 75 62 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  osub.**   }.**.*
c2b0: 2a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  *===============
c2c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c2d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c2e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c2f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 0a 2a 2a 20  =========.**.** 
c300: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
c310: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
c320: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
c330: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
c340: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
c350: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
c360: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
c370: 7a 65 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ze).**     }.** 
c380: 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
c390: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
c3a0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75  lue).**     Gosu
c3b0: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
c3c0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
c3d0: 28 29 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  ().**.*/.void sq
c3e0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
c3f0: 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
c400: 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20  arse, .  Select 
c410: 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p,.  WhereInfo 
c420: 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72  *pWInfo,.  int r
c430: 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20  egGosub, .  int 
c440: 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57  addrGosub.){.  W
c450: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
c460: 2d 3e 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77  ->pWin;.  Window
c470: 20 2a 70 57 69 6e 3b 0a 0a 20 20 69 66 28 20 28   *pWin;..  if( (
c480: 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
c490: 5f 52 4f 57 53 20 0a 20 20 20 26 26 20 28 70 4d  _ROWS .   && (pM
c4a0: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
c4b0: 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69 6e  UNBOUNDED||pMWin
c4c0: 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52 45  ->eEnd!=TK_CURRE
c4d0: 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72 64  NT||!pMWin->pOrd
c4e0: 65 72 42 79 29 29 0a 20 20 20 7c 7c 20 28 70 4d  erBy)).   || (pM
c4f0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
c500: 43 55 52 52 45 4e 54 26 26 70 4d 57 69 6e 2d 3e  CURRENT&&pMWin->
c510: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
c520: 45 44 26 26 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  ED&&pMWin->pOrde
c530: 72 42 79 29 0a 20 20 29 7b 0a 20 20 20 20 77 69  rBy).  ){.    wi
c540: 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53  ndowCodeRowExprS
c550: 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
c560: 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
c570: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
c580: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
c590: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c5a0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c5b0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c5c0: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
c5d0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
c5e0: 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75    if( (pFunc->fu
c5f0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c600: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
c610: 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  E).     || (pFun
c620: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  c->xSFunc==nth_v
c630: 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20 20  alueStepFunc).  
c640: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53     || (pFunc->xS
c650: 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Func==first_valu
c660: 65 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20 20  eStepFunc).     
c670: 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e  || (pFunc->xSFun
c680: 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 29  c==leadStepFunc)
c690: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
c6a0: 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70  >xSFunc==lagStep
c6b0: 46 75 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20  Func).    ){.   
c6c0: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63     windowCodeCac
c6d0: 68 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  heStep(pParse, p
c6e0: 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
c6f0: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
c700: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c710: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f    }.  }..  windo
c720: 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
c730: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
c740: 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  fo, regGosub, ad
c750: 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a           drGosub);.}..