Changeset: 64aa8408ee4e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64aa8408ee4e
Added Files:
        gdk/gdk_analytic.h
        gdk/gdk_analytic_bounds.c
        gdk/gdk_analytic_func.c
        monetdb5/modules/atoms/mtime_analytic.c
        sql/backends/monet5/sql_rank.mal.sh
        sql/backends/monet5/sql_rank_hge.mal
        sql/backends/monet5/sql_rank_hge.mal.sh
        sql/test/analytics/Tests/All
        sql/test/analytics/Tests/analytics00.sql
        sql/test/analytics/Tests/analytics00.stable.err
        sql/test/analytics/Tests/analytics00.stable.out
        sql/test/analytics/Tests/analytics01.sql
        sql/test/analytics/Tests/analytics01.stable.err
        sql/test/analytics/Tests/analytics01.stable.out
        sql/test/analytics/Tests/analytics02.sql
        sql/test/analytics/Tests/analytics02.stable.err
        sql/test/analytics/Tests/analytics02.stable.out
        sql/test/analytics/Tests/analytics03.sql
        sql/test/analytics/Tests/analytics03.stable.err
        sql/test/analytics/Tests/analytics03.stable.out
        sql/test/analytics/Tests/analytics04.sql
        sql/test/analytics/Tests/analytics04.stable.err
        sql/test/analytics/Tests/analytics04.stable.out
        sql/test/analytics/Tests/analytics05.sql
        sql/test/analytics/Tests/analytics05.stable.err
        sql/test/analytics/Tests/analytics05.stable.out
        sql/test/analytics/Tests/analytics06.sql
        sql/test/analytics/Tests/analytics06.stable.err
        sql/test/analytics/Tests/analytics06.stable.out
        sql/test/analytics/Tests/analytics07.sql
        sql/test/analytics/Tests/analytics07.stable.err
        sql/test/analytics/Tests/analytics07.stable.out
        sql/test/analytics/Tests/analytics08.sql
        sql/test/analytics/Tests/analytics08.stable.err
        sql/test/analytics/Tests/analytics08.stable.out
        sql/test/analytics/Tests/analytics09.sql
        sql/test/analytics/Tests/analytics09.stable.err
        sql/test/analytics/Tests/analytics09.stable.out
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        clients/mapiclient/mhelp.c
        clients/odbc/driver/SQLGetInfo.c
        gdk/Makefile.ag
        gdk/gdk_aggr.c
        gdk/gdk_bbp.c
        gdk/gdk_calc_private.h
        monetdb5/modules/atoms/Makefile.ag
        monetdb5/modules/atoms/mtime.c
        monetdb5/modules/atoms/mtime.h
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        sql/backends/monet5/Makefile.ag
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_hge.mal
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
        sql/backends/monet5/sql_rank.mal
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/include/sql_catalog.h
        sql/scripts/51_sys_schema_extension.sql
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_atom.c
        sql/server/sql_atom.h
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/server/sql_symbol.c
        sql/server/sql_symbol.h
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/foreign_key_in_frontend_crashes_backend.SF-935578.sql
        
sql/test/BugTracker-2009/Tests/orderby_with_row_number.SF-2895791.stable.out
        
sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
        
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
        
sql/test/BugTracker-2018/Tests/groupby_having_orderby_count.Bug-6624.stable.out
        sql/test/Tests/rank.stable.out
        sql/test/Tests/systemfunctions.stable.out
        sql/test/Tests/systemfunctions.stable.out.int128
        sql/test/emptydb/Tests/check.stable.out
        sql/test/emptydb/Tests/check.stable.out.32bit
        sql/test/emptydb/Tests/check.stable.out.int128
Branch: default
Log Message:

Merged with analytics branch.


diffs (truncated from 19219 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -8377,6 +8377,14 @@ Ready.
 [ "batrapi",   "subeval_aggr", "pattern batrapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ", "RAPIevalAggr;",        "grouped aggregates 
through R"  ]
 [ "batsql",    "alpha",        "command batsql.alpha(dec:bat[:dbl], 
theta:dbl):bat[:dbl] ",    "SQLbat_alpha_cst;",    "BAT implementation of 
astronomy alpha function"        ]
 [ "batsql",    "alpha",        "command batsql.alpha(dec:dbl, 
theta:bat[:dbl]):bat[:dbl] ",    "SQLcst_alpha_bat;",    "BAT implementation of 
astronomy alpha function"        ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "count",        "pattern batsql.count(b:bat[:any_1], 
ignils:bit, s:bat[:lng], e:bat[:lng]):bat[:lng] ", "SQLcount;",    "return 
count of groups"        ]
+[ "batsql",    "cume_dist",    "pattern batsql.cume_dist(b:bat[:any_1], 
p:any_2, o:any_3):bat[:dbl] ", "SQLcume_dist;",        "return the accumulated 
distribution of the number of rows per group to the total number of partition 
rows"     ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:bte], 
r:bte):bat[:bte] ",      "bte_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:dbl], 
r:dbl):bat[:dbl] ",      "dbl_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:flt], 
r:flt):bat[:flt] ",      "flt_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
@@ -8386,8 +8394,38 @@ Ready.
 [ "batsql",    "dense_rank",   "pattern batsql.dense_rank(b:bat[:any_1], 
p:any_2, o:any_3):bat[:int] ",        "SQLdense_rank;",       "return the 
densely ranked groups"      ]
 [ "batsql",    "diff", "pattern batsql.diff(b:bat[:any_1]):bat[:bit] ",        
"SQLdiff;",     "return true if cur != prev row"        ]
 [ "batsql",    "diff", "pattern batsql.diff(p:bat[:bit], 
b:bat[:any_1]):bat[:bit] ",   "SQLdiff;",     "return true if cur != prev row"  
      ]
+[ "batsql",    "first_value",  "pattern batsql.first_value(b:bat[:any_1], 
s:bat[:lng], e:bat[:lng]):bat[:any_1] ",     "SQLfirst_value;",      "return 
the first value of groups"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, d:any_1, 
p:any_3, o:any_4):bat[:any_1] ",   "SQLlag;",      "return the value in the 
previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",     "SQLlag;",      "return the 
value in the previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, p:any_3, 
o:any_4):bat[:any_1] ",    "SQLlag;",      "return the value in the previous 
'l' row in the partition or NULL if non existent"     ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
d:any_1, p:any_3, o:any_4):bat[:any_1] ",     "SQLlag;",      "return the value 
in the previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",       "SQLlag;",      "return 
the value in the previous 'l' row in the partition or 'd' if non existent"      
]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
p:any_3, o:any_4):bat[:any_1] ",      "SQLlag;",      "return the value in the 
previous 'l' row in the partition or NULL if non existent"     ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], p:any_3, 
o:any_4):bat[:any_1] ",     "SQLlag;",      "return the value in the previous 
row in the partition or NULL if non existent" ]
+[ "batsql",    "last_value",   "pattern batsql.last_value(b:bat[:any_1], 
s:bat[:lng], e:bat[:lng]):bat[:any_1] ",      "SQLlast_value;",       "return 
the last value of groups"       ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, d:any_1, 
p:any_3, o:any_4):bat[:any_1] ",  "SQLlead;",     "return the value in the next 
'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",    "SQLlead;",     "return the 
value in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, p:any_3, 
o:any_4):bat[:any_1] ",   "SQLlead;",     "return the value in the next 'l' row 
in the partition or NULL if non existent" ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
d:any_1, p:any_3, o:any_4):bat[:any_1] ",    "SQLlead;",     "return the value 
in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",      "SQLlead;",     "return 
the value in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
p:any_3, o:any_4):bat[:any_1] ",     "SQLlead;",     "return the value in the 
next 'l' row in the partition or NULL if non existent" ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], p:any_3, 
o:any_4):bat[:any_1] ",    "SQLlead;",     "return the value in the next row in 
the partition or NULL if non existent"     ]
+[ "batsql",    "max",  "pattern batsql.max(b:bat[:any_1], s:bat[:lng], 
e:bat[:lng]):bat[:any_1] ",     "SQLmax;",      "return the maximum of groups"  
]
+[ "batsql",    "min",  "pattern batsql.min(b:bat[:any_1], s:bat[:lng], 
e:bat[:lng]):bat[:any_1] ",     "SQLmin;",      "return the minimum of groups"  
]
 [ "batsql",    "next_value",   "pattern batsql.next_value(sname:bat[:str], 
sequence:str):bat[:lng] ",  "mvc_bat_next_value;",  "return the next value of 
the sequence" ]
+[ "batsql",    "nth_value",    "pattern batsql.nth_value(b:bat[:any_1], 
n:any_2, s:bat[:lng], e:bat[:lng]):bat[:any_1] ",      "SQLnth_value;",        
"return the nth value of each group"    ]
+[ "batsql",    "nth_value",    "pattern batsql.nth_value(b:bat[:any_1], 
n:bat[:any_2], s:bat[:lng], e:bat[:lng]):bat[:any_1] ",        "SQLnth_value;", 
       "return the nth value of each group"    ]
+[ "batsql",    "ntile",        "pattern batsql.ntile(b:bat[:any_1], n:any_2, 
p:any_3, o:any_4):bat[:any_2] ",  "SQLntile;",    "return the groups divided as 
equally as possible"      ]
+[ "batsql",    "ntile",        "pattern batsql.ntile(b:bat[:any_1], 
n:bat[:any_2], p:any_3, o:any_4):bat[:any_2] ",    "SQLntile;",    "return the 
groups divided as equally as possible"      ]
 [ "batsql",    "password",     "pattern 
batsql.password(user:bat[:str]):bat[:str] ",   "db_password_wrap;",    "Return 
password hash of user"  ]
+[ "batsql",    "percent_rank", "pattern batsql.percent_rank(b:bat[:any_1], 
p:any_2, o:any_3):bat[:dbl] ",      "SQLpercent_rank;",     "return the 
percentage into the total number of groups for each row"    ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:flt] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
 [ "batsql",    "rank", "pattern batsql.rank(b:bat[:any_1], p:any_2, 
o:any_3):bat[:int] ",      "SQLrank;",     "return the ranked groups"      ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:bte], d:int, 
s:int, r:bte):bat[:bte] ",    "bte_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:dbl], 
r:bte):bat[:dbl] ",  "dbl_bat_round_wrap;",  "round off the floating point v to 
r digits behind the dot (if r < 0, before the dot)"  ]
@@ -8396,6 +8434,37 @@ Ready.
 [ "batsql",    "round",        "command batsql.round(v:bat[:lng], d:int, 
s:int, r:bte):bat[:lng] ",    "lng_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:sht], d:int, 
s:int, r:bte):bat[:sht] ",    "sht_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "row_number",   "pattern batsql.row_number(b:bat[:any_1], 
p:any_2, o:any_3):bat[:int] ",        "SQLrow_number;",       "return the 
row_numer-ed groups"        ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:flt] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:bte]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:dbl]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:flt]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:int]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:lng]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:sht]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bte):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:dbl):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:flt):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:int):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:lng):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:sht):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:bte]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:dbl]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:flt]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:int]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:lng]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:sht]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bte):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:dbl):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:flt):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:int):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:lng):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:sht):bat[:lng] ", 
"SQLwindow_bound;",     "computes window ranges for each row"   ]
 [ "batstr",    "endsWith",     "command batstr.endsWith(s:bat[:str], 
suffix:bat[:str]):bat[:bit] ",    "STRbatSuffix;",        "Suffix check." ]
 [ "batstr",    "endsWith",     "command batstr.endsWith(s:bat[:str], 
suffix:str):bat[:bit] ",  "STRbatSuffixcst;",     "Suffix check." ]
 [ "batstr",    "length",       "command batstr.length(s:bat[:str]):bat[:int] 
",        "STRbatLength;",        "Return the length of a string."        ]
@@ -10915,6 +10984,12 @@ Ready.
 [ "sql",       "assert",       "pattern sql.assert(b:bit, msg:str):void ",     
"SQLassert;",   "Generate an exception when b==true"    ]
 [ "sql",       "assert",       "pattern sql.assert(b:int, msg:str):void ",     
"SQLassertInt;",        "Generate an exception when b!=0"       ]
 [ "sql",       "assert",       "pattern sql.assert(b:lng, msg:str):void ",     
"SQLassertLng;",        "Generate an exception when b!=0"       ]
+[ "sql",       "avg",  "pattern sql.avg(b:bte, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
+[ "sql",       "avg",  "pattern sql.avg(b:dbl, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
+[ "sql",       "avg",  "pattern sql.avg(b:flt, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
+[ "sql",       "avg",  "pattern sql.avg(b:int, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
+[ "sql",       "avg",  "pattern sql.avg(b:lng, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
+[ "sql",       "avg",  "pattern sql.avg(b:sht, s:lng, e:lng):dbl ",    
"SQLavg;",      "return the average of groups"  ]
 [ "sql",       "bind", "pattern sql.bind(mvc:int, schema:str, table:str, 
column:str, access:int) (uid:bat[:oid], uval:bat[:any_1]) ",  "mvc_bind_wrap;", 
      "Bind the 'schema.table.column' BAT with access kind:\n\t0 - base 
table\n\t1 - inserts\n\t2 - updates"  ]
 [ "sql",       "bind", "pattern sql.bind(mvc:int, schema:str, table:str, 
column:str, access:int):bat[:any_1] ",        "mvc_bind_wrap;",       "Bind the 
'schema.table.column' BAT with access kind:\n\t0 - base table\n\t1 - 
inserts\n\t2 - updates"  ]
 [ "sql",       "bind", "pattern sql.bind(mvc:int, schema:str, table:str, 
column:str, access:int, part_nr:int, nr_parts:int) (uid:bat[:oid], 
uval:bat[:any_1]) ",       "mvc_bind_wrap;",       "Bind the 
'schema.table.column' BAT with access kind:\n\t0 - base table\n\t1 - 
inserts\n\t2 - updates"  ]
@@ -10928,7 +11003,9 @@ Ready.
 [ "sql",       "copy_from",    "pattern sql.copy_from(t:ptr, sep:str, 
rsep:str, ssep:str, ns:str, fname:str, nr:lng, offset:lng, locked:int, 
best:int, fwf:str, onclient:int):bat[:any]... ",  "mvc_import_table_wrap;",     
  "Import a table from bstream s with the \n\tgiven tuple and seperators 
(sep/rsep)"      ]
 [ "sql",       "copy_rejects", "pattern sql.copy_rejects() (rowid:bat[:lng], 
fldid:bat[:int], msg:bat[:str], inp:bat[:str]) ", "COPYrejects;", ""      ]
 [ "sql",       "copy_rejects_clear",   "pattern sql.copy_rejects_clear():void 
",       "COPYrejects_clear;",   ""      ]
+[ "sql",       "count",        "pattern sql.count(b:any_1, ignils:bit, s:lng, 
e:lng):lng ",    "SQLcount;",    "return count of groups"        ]
 [ "sql",       "createorderindex",     "pattern sql.createorderindex(sch:str, 
tbl:str, col:str):void ",        "sql_createorderindex;",        "Instantiate 
the order index on a column"       ]
+[ "sql",       "cume_dist",    "pattern sql.cume_dist(b:any_1, p:bit, 
o:bit):dbl ",    "SQLcume_dist;",        "return the accumulated distribution 
of the number of rows per group to the total number of partition rows"     ]
 [ "sql",       "current_time", "pattern sql.current_time():daytime ",  
"SQLcurrent_daytime;",  "Get the clients current daytime"       ]
 [ "sql",       "current_timestamp",    "pattern 
sql.current_timestamp():timestamp ",   "SQLcurrent_timestamp;",        "Get the 
clients current timestamp"     ]
 [ "sql",       "db_users",     "pattern sql.db_users():bat[:str] ",    
"db_users_wrap;",       "return table of users with sql scenario"       ]
@@ -10968,6 +11045,7 @@ Ready.
 [ "sql",       "exportResult", "pattern sql.exportResult(s:streams, 
res_id:int):void ",        "mvc_export_result_wrap;",      "Export a result (in 
order) to stream s"        ]
 [ "sql",       "export_table", "pattern sql.export_table(fname:str, fmt:str, 
colsep:str, recsep:str, qout:str, nullrep:str, onclient:int, tbl:bat[:str], 
attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:any...):int 
",    "mvc_export_row_wrap;", "Prepare a table result set for the COPY INTO 
stream"   ]
 [ "sql",       "export_table", "pattern sql.export_table(fname:str, fmt:str, 
colsep:str, recsep:str, qout:str, nullrep:str, onclient:int, tbl:bat[:str], 
attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], 
cols:bat[:any]...):int ",      "mvc_export_table_wrap;",       "Prepare a table 
result set for the COPY INTO stream"   ]
+[ "sql",       "first_value",  "pattern sql.first_value(b:any_1, s:lng, 
e:lng):any_1 ",        "SQLfirst_value;",      "return the first value of 
groups"      ]
 [ "sql",       "flush_log",    "command sql.flush_log():void ",        
"SQLflush_log;",        "flush the log now"     ]
 [ "sql",       "getVariable",  "pattern sql.getVariable(mvc:int, 
varname:str):any_1 ", "getVariable;", "Get the value of a session variable"   ]
 [ "sql",       "getVersion",   "command sql.getVersion(clientid:int):lng ",    
"mvc_getVersion;",      "Return the database version identifier for a client."  
]
@@ -10976,16 +11054,45 @@ Ready.
 [ "sql",       "importTable",  "pattern sql.importTable(sname:str, tname:str, 
onclient:int, fname:str...):bat[:any]... ",      "mvc_bin_import_table_wrap;",  
 "Import a table from the files (fname)" ]
 [ "sql",       "include",      "pattern sql.include(fname:str):void ", 
"SQLinclude;",  "Compile and execute a sql statements on the file"      ]
 [ "sql",       "init", "pattern sql.init():void ",     "SQLinitEnvironment;",  
"Initialize the environment for MAL"    ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:any_2, d:any_1, p:any_3, 
o:any_4):any_1 ",  "SQLlag;",      "return the value in the previous 'l' row in 
the partition or 'd' if non existent"      ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:any_2, d:bat[:any_1], 
p:any_3, o:any_4):any_1 ",    "SQLlag;",      "return the value in the previous 
'l' row in the partition or 'd' if non existent"      ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:any_2, p:any_3, 
o:any_4):any_1 ",   "SQLlag;",      "return the value in the previous 'l' row 
in the partition or NULL if non existent"     ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:bat[:any_2], d:any_1, 
p:any_3, o:any_4):any_1 ",    "SQLlag;",      "return the value in the previous 
'l' row in the partition or 'd' if non existent"      ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:bat[:any_2], d:bat[:any_1], 
p:any_3, o:any_4):any_1 ",      "SQLlag;",      "return the value in the 
previous 'l' row in the partition or 'd' if non existent"      ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, l:bat[:any_2], p:any_3, 
o:any_4):any_1 ",     "SQLlag;",      "return the value in the previous 'l' row 
in the partition or NULL if non existent"     ]
+[ "sql",       "lag",  "pattern sql.lag(b:any_1, p:any_3, o:any_4):any_1 ",    
"SQLlag;",      "return the value in the previous row in the partition or NULL 
if non existent" ]
+[ "sql",       "last_value",   "pattern sql.last_value(b:any_1, s:lng, 
e:lng):any_1 ", "SQLlast_value;",       "return the last value of groups"       
]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:any_2, d:any_1, p:any_3, 
o:any_4):any_1 ", "SQLlead;",     "return the value in the next 'l' row in the 
partition or 'd' if non existent"  ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:any_2, d:bat[:any_1], 
p:any_3, o:any_4):any_1 ",   "SQLlead;",     "return the value in the next 'l' 
row in the partition or 'd' if non existent"  ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:any_2, p:any_3, 
o:any_4):any_1 ",  "SQLlead;",     "return the value in the next 'l' row in the 
partition or NULL if non existent" ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:bat[:any_2], d:any_1, 
p:any_3, o:any_4):any_1 ",   "SQLlead;",     "return the value in the next 'l' 
row in the partition or 'd' if non existent"  ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4):any_1 ",     "SQLlead;",     "return the value 
in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, l:bat[:any_2], p:any_3, 
o:any_4):any_1 ",    "SQLlead;",     "return the value in the next 'l' row in 
the partition or NULL if non existent" ]
+[ "sql",       "lead", "pattern sql.lead(b:any_1, p:any_3, o:any_4):any_1 ",   
"SQLlead;",     "return the value in the next row in the partition or NULL if 
non existent"     ]
 [ "sql",       "logfile",      "pattern sql.logfile(filename:str):void ",      
"mvc_logfile;", "Enable/disable saving the sql statement traces"        ]
+[ "sql",       "max",  "pattern sql.max(b:any_1, s:lng, e:lng):any_1 ",        
"SQLmax;",      "return the maximum of groups"  ]
+[ "sql",       "min",  "pattern sql.min(b:any_1, s:lng, e:lng):any_1 ",        
"SQLmin;",      "return the minimum of groups"  ]
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(v:dbl, r:int):dbl ",      
"dbl_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "ms_trunc",     "command sql.ms_trunc(v:flt, r:int):flt ",      
"flt_trunc_wrap;",      "truncate the floating point v to r digits behind the 
dot (if r < 0, before the dot)"   ]
 [ "sql",       "mvc",  "pattern sql.mvc():int ",       "SQLmvc;",      "Get 
the multiversion catalog context. \nNeeded for correct statement 
dependencies\n(ie sql.update, should be after sql.bind in concurrent 
execution)"  ]
 [ "sql",       "next_value",   "pattern sql.next_value(sname:str, 
sequence:str):lng ", "mvc_next_value;",      "return the next value of the 
sequence" ]
 [ "sql",       "not_unique",   "command sql.not_unique(b:bat[:oid]):bit ",     
"not_unique;",  "check if the tail sorted bat b doesn't have unique tail 
values"        ]
+[ "sql",       "nth_value",    "pattern sql.nth_value(b:any_1, n:any_2, s:lng, 
e:lng):any_1 ", "SQLnth_value;",        "return the nth value of each group"    
]
+[ "sql",       "nth_value",    "pattern sql.nth_value(b:any_1, n:bat[:any_2], 
s:lng, e:lng):any_1 ",   "SQLnth_value;",        "return the nth value of each 
group"    ]
+[ "sql",       "ntile",        "pattern sql.ntile(b:any_1, n:any_2, p:any_3, 
o:any_4):any_2 ", "SQLntile;",    "return the groups divided as equally as 
possible"      ]
+[ "sql",       "ntile",        "pattern sql.ntile(b:any_1, n:bat[:any_2], 
p:any_3, o:any_4):any_2 ",   "SQLntile;",    "return the groups divided as 
equally as possible"      ]
 [ "sql",       "optimizer_updates",    "pattern sql.optimizer_updates():void 
",        "SQLoptimizersUpdate;", ""      ]
 [ "sql",       "optimizers",   "command sql.optimizers() (X_0:bat[:str], 
X_1:bat[:str], X_2:bat[:str]) ",      "getPipeCatalog;",      ""      ]
 [ "sql",       "password",     "pattern sql.password(user:str):str ",  
"db_password_wrap;",    "Return password hash of user"  ]
+[ "sql",       "percent_rank", "pattern sql.percent_rank(b:any_1, p:bit, 
o:bit):dbl ", "SQLpercent_rank;",     "return the percentage into the total 
number of groups for each row"    ]
 [ "sql",       "prelude",      "pattern sql.prelude():void ",  "SQLprelude;",  
""      ]
+[ "sql",       "prod", "pattern sql.prod(b:bte, s:lng, e:lng):lng ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:dbl, s:lng, e:lng):dbl ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:flt, s:lng, e:lng):dbl ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:flt, s:lng, e:lng):flt ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:int, s:lng, e:lng):lng ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:lng, s:lng, e:lng):lng ",   
"SQLprod;",     "return the product of groups"  ]
+[ "sql",       "prod", "pattern sql.prod(b:sht, s:lng, e:lng):lng ",   
"SQLprod;",     "return the product of groups"  ]
 [ "sql",       "project",      "command sql.project(col:bat[:oid], 
l:bat[:oid], r:bat[:oid]):bat[:oid] ",      "BATleftproject;",      "Last step 
of a left outer join, ie project the inner join (l,r) over the left input side 
(col)"        ]
 [ "sql",       "projectdelta", "command sql.projectdelta(select:bat[:oid], 
col:bat[:any_3], uid:bat[:oid], uval:bat[:any_3]):bat[:any_3] ",    
"DELTAproject2;",       "Return column bat with delta's applied."       ]
 [ "sql",       "projectdelta", "command sql.projectdelta(select:bat[:oid], 
col:bat[:any_3], uid:bat[:oid], uval:bat[:any_3], ins:bat[:any_3]):bat[:any_3] 
",   "DELTAproject;",        "Return column bat with delta's applied."       ]
@@ -11031,6 +11138,13 @@ Ready.
 [ "sql",       "subdelta",     "command sql.subdelta(col:bat[:oid], 
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid]):bat[:oid] ",        
"DELTAsub2;",   "Return a single bat of selected delta."        ]
 [ "sql",       "subdelta",     "command sql.subdelta(col:bat[:oid], 
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid], ins:bat[:oid]):bat[:oid] ", 
"DELTAsub;",    "Return a single bat of selected delta."        ]
 [ "sql",       "subzero_or_one",       "inline function 
sql.subzero_or_one(b:bat[:any_1], gp:bat[:oid], gpe:bat[:oid], 
no_nil:bit):bat[:any_1];",      "",     ""      ]
+[ "sql",       "sum",  "pattern sql.sum(b:bte, s:lng, e:lng):lng ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:dbl, s:lng, e:lng):dbl ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:flt, s:lng, e:lng):dbl ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:flt, s:lng, e:lng):flt ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:int, s:lng, e:lng):lng ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:lng, s:lng, e:lng):lng ",    
"SQLsum;",      "return the sum of groups"      ]
+[ "sql",       "sum",  "pattern sql.sum(b:sht, s:lng, e:lng):lng ",    
"SQLsum;",      "return the sum of groups"      ]
 [ "sql",       "sysmon_pause", "pattern sql.sysmon_pause(tag:int):void ",      
"SYSMONpause;", ""      ]
 [ "sql",       "sysmon_pause", "pattern sql.sysmon_pause(tag:lng):void ",      
"SYSMONpause;", ""      ]
 [ "sql",       "sysmon_pause", "pattern sql.sysmon_pause(tag:sht):void ",      
"SYSMONpause;", ""      ]
@@ -11053,6 +11167,18 @@ Ready.
 [ "sql",       "update_schemas",       "pattern sql.update_schemas():void ",   
"SYSupdate_schemas;",   "Procedure triggered on update of the sys.schemas 
table"        ]
 [ "sql",       "update_tables",        "pattern sql.update_tables():void ",    
"SYSupdate_tables;",    "Procedure triggered on update of the sys._tables 
table"        ]
 [ "sql",       "vacuum",       "pattern sql.vacuum(sch:str, tbl:str):void ",   
"SQLvacuum;",   "Choose an approach to consolidate the deletions"       ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:bte):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:dbl):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:flt):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:int):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:lng):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:sht):lng ",     "SQLwindow_bound;",     "computes 
window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:bte):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:dbl):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:flt):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:int):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:lng):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
+[ "sql",       "window_bound", "pattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:sht):lng ",      "SQLwindow_bound;",     
"computes window ranges for each row"   ]
 [ "sql",       "zero_or_one",  "command sql.zero_or_one(col:bat[:any_1]):any_1 
",      "zero_or_one;", "if col contains exactly one value return this. Incase 
of more raise an exception else return nil"      ]
 [ "sqlblob",   "#fromstr",     "command sqlblob.#fromstr():void ",     
"SQLBLOBfromstr;",      ""      ]
 [ "sqlblob",   "#tostr",       "command sqlblob.#tostr():void ",       
"SQLBLOBtostr;",        ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -11949,6 +11949,15 @@ Ready.
 [ "batrapi",   "subeval_aggr", "pattern batrapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ", "RAPIevalAggr;",        "grouped aggregates 
through R"  ]
 [ "batsql",    "alpha",        "command batsql.alpha(dec:bat[:dbl], 
theta:dbl):bat[:dbl] ",    "SQLbat_alpha_cst;",    "BAT implementation of 
astronomy alpha function"        ]
 [ "batsql",    "alpha",        "command batsql.alpha(dec:dbl, 
theta:bat[:dbl]):bat[:dbl] ",    "SQLcst_alpha_bat;",    "BAT implementation of 
astronomy alpha function"        ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:hge], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "avg",  "pattern batsql.avg(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLavg;",      "return the average of groups"  ]
+[ "batsql",    "count",        "pattern batsql.count(b:bat[:any_1], 
ignils:bit, s:bat[:lng], e:bat[:lng]):bat[:lng] ", "SQLcount;",    "return 
count of groups"        ]
+[ "batsql",    "cume_dist",    "pattern batsql.cume_dist(b:bat[:any_1], 
p:any_2, o:any_3):bat[:dbl] ", "SQLcume_dist;",        "return the accumulated 
distribution of the number of rows per group to the total number of partition 
rows"     ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:bte], 
r:bte):bat[:bte] ",      "bte_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:dbl], 
r:dbl):bat[:dbl] ",      "dbl_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
 [ "batsql",    "dec_round",    "command batsql.dec_round(v:bat[:flt], 
r:flt):bat[:flt] ",      "flt_bat_dec_round_wrap;",      "round off the value v 
to nearests multiple of r"       ]
@@ -11959,8 +11968,43 @@ Ready.
 [ "batsql",    "dense_rank",   "pattern batsql.dense_rank(b:bat[:any_1], 
p:any_2, o:any_3):bat[:int] ",        "SQLdense_rank;",       "return the 
densely ranked groups"      ]
 [ "batsql",    "diff", "pattern batsql.diff(b:bat[:any_1]):bat[:bit] ",        
"SQLdiff;",     "return true if cur != prev row"        ]
 [ "batsql",    "diff", "pattern batsql.diff(p:bat[:bit], 
b:bat[:any_1]):bat[:bit] ",   "SQLdiff;",     "return true if cur != prev row"  
      ]
+[ "batsql",    "first_value",  "pattern batsql.first_value(b:bat[:any_1], 
s:bat[:lng], e:bat[:lng]):bat[:any_1] ",     "SQLfirst_value;",      "return 
the first value of groups"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, d:any_1, 
p:any_3, o:any_4):bat[:any_1] ",   "SQLlag;",      "return the value in the 
previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",     "SQLlag;",      "return the 
value in the previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:any_2, p:any_3, 
o:any_4):bat[:any_1] ",    "SQLlag;",      "return the value in the previous 
'l' row in the partition or NULL if non existent"     ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
d:any_1, p:any_3, o:any_4):bat[:any_1] ",     "SQLlag;",      "return the value 
in the previous 'l' row in the partition or 'd' if non existent"      ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",       "SQLlag;",      "return 
the value in the previous 'l' row in the partition or 'd' if non existent"      
]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
p:any_3, o:any_4):bat[:any_1] ",      "SQLlag;",      "return the value in the 
previous 'l' row in the partition or NULL if non existent"     ]
+[ "batsql",    "lag",  "pattern batsql.lag(b:bat[:any_1], p:any_3, 
o:any_4):bat[:any_1] ",     "SQLlag;",      "return the value in the previous 
row in the partition or NULL if non existent" ]
+[ "batsql",    "last_value",   "pattern batsql.last_value(b:bat[:any_1], 
s:bat[:lng], e:bat[:lng]):bat[:any_1] ",      "SQLlast_value;",       "return 
the last value of groups"       ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, d:any_1, 
p:any_3, o:any_4):bat[:any_1] ",  "SQLlead;",     "return the value in the next 
'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",    "SQLlead;",     "return the 
value in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:any_2, p:any_3, 
o:any_4):bat[:any_1] ",   "SQLlead;",     "return the value in the next 'l' row 
in the partition or NULL if non existent" ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
d:any_1, p:any_3, o:any_4):bat[:any_1] ",    "SQLlead;",     "return the value 
in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4):bat[:any_1] ",      "SQLlead;",     "return 
the value in the next 'l' row in the partition or 'd' if non existent"  ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
p:any_3, o:any_4):bat[:any_1] ",     "SQLlead;",     "return the value in the 
next 'l' row in the partition or NULL if non existent" ]
+[ "batsql",    "lead", "pattern batsql.lead(b:bat[:any_1], p:any_3, 
o:any_4):bat[:any_1] ",    "SQLlead;",     "return the value in the next row in 
the partition or NULL if non existent"     ]
+[ "batsql",    "max",  "pattern batsql.max(b:bat[:any_1], s:bat[:lng], 
e:bat[:lng]):bat[:any_1] ",     "SQLmax;",      "return the maximum of groups"  
]
+[ "batsql",    "min",  "pattern batsql.min(b:bat[:any_1], s:bat[:lng], 
e:bat[:lng]):bat[:any_1] ",     "SQLmin;",      "return the minimum of groups"  
]
 [ "batsql",    "next_value",   "pattern batsql.next_value(sname:bat[:str], 
sequence:str):bat[:lng] ",  "mvc_bat_next_value;",  "return the next value of 
the sequence" ]
+[ "batsql",    "nth_value",    "pattern batsql.nth_value(b:bat[:any_1], 
n:any_2, s:bat[:lng], e:bat[:lng]):bat[:any_1] ",      "SQLnth_value;",        
"return the nth value of each group"    ]
+[ "batsql",    "nth_value",    "pattern batsql.nth_value(b:bat[:any_1], 
n:bat[:any_2], s:bat[:lng], e:bat[:lng]):bat[:any_1] ",        "SQLnth_value;", 
       "return the nth value of each group"    ]
+[ "batsql",    "ntile",        "pattern batsql.ntile(b:bat[:any_1], n:any_2, 
p:any_3, o:any_4):bat[:any_2] ",  "SQLntile;",    "return the groups divided as 
equally as possible"      ]
+[ "batsql",    "ntile",        "pattern batsql.ntile(b:bat[:any_1], 
n:bat[:any_2], p:any_3, o:any_4):bat[:any_2] ",    "SQLntile;",    "return the 
groups divided as equally as possible"      ]
 [ "batsql",    "password",     "pattern 
batsql.password(user:bat[:str]):bat[:str] ",   "db_password_wrap;",    "Return 
password hash of user"  ]
+[ "batsql",    "percent_rank", "pattern batsql.percent_rank(b:bat[:any_1], 
p:any_2, o:any_3):bat[:dbl] ",      "SQLpercent_rank;",     "return the 
percentage into the total number of groups for each row"    ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:flt] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:hge], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ",        "SQLprod;",     "return the product of groups" 
 ]
+[ "batsql",    "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ",        "SQLprod;",     "return the product of groups" 
 ]
 [ "batsql",    "rank", "pattern batsql.rank(b:bat[:any_1], p:any_2, 
o:any_3):bat[:int] ",      "SQLrank;",     "return the ranked groups"      ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:bte], d:int, 
s:int, r:bte):bat[:bte] ",    "bte_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:dbl], 
r:bte):bat[:dbl] ",  "dbl_bat_round_wrap;",  "round off the floating point v to 
r digits behind the dot (if r < 0, before the dot)"  ]
@@ -11970,6 +12014,46 @@ Ready.
 [ "batsql",    "round",        "command batsql.round(v:bat[:lng], d:int, 
s:int, r:bte):bat[:lng] ",    "lng_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "round",        "command batsql.round(v:bat[:sht], d:int, 
s:int, r:bte):bat[:sht] ",    "sht_bat_round_wrap;",  "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)"    ]
 [ "batsql",    "row_number",   "pattern batsql.row_number(b:bat[:any_1], 
p:any_2, o:any_3):bat[:int] ",        "SQLrow_number;",       "return the 
row_numer-ed groups"        ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:dbl] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]):bat[:flt] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:hge], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:int], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:hge] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "sum",  "pattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]):bat[:lng] ", "SQLsum;",      "return the sum of groups"      ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:bte]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:dbl]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:flt]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:int]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:lng]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:sht]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bte):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:dbl):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:flt):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:int):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:lng):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:sht):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, start:bat[:hge]):bat[:lng] ",        
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, start:hge):bat[:lng] ",      "SQLwindow_bound;", 
    "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:bte]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
+[ "batsql",    "window_bound", "pattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:dbl]):bat[:lng] ",   
"SQLwindow_bound;",     "computes window ranges for each row"   ]
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to