/ Hex Artifact Content
Login

Artifact 72c08229b59a447db5ffb8e87680105549465df502092e0e24f9451e6b082031:


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