Changeset: ffb46ba9f229 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffb46ba9f229
Removed Files:
        sql/scripts/11_times.sql
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        gdk/gdk_aggr.c
        gdk/gdk_calc.h
        gdk/gdk_group.c
        monetdb5/modules/kernel/aggr.c
        monetdb5/modules/kernel/aggr.mal
        monetdb5/modules/kernel/aggr.mal.sh
        sql/ChangeLog.Nov2019
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_upgrades.c
        sql/common/sql_list.c
        sql/include/sql_relation.h
        sql/scripts/39_analytics.sql
        sql/scripts/39_analytics_hge.sql
        sql/scripts/Makefile.ag
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/union_limitation.SF-921992.stable.out
        sql/test/BugTracker-2016/Tests/leftjoin.Bug-3981.stable.out
        
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
        sql/test/Tests/window_functions.stable.out
        sql/test/analytics/Tests/analytics09.stable.err
        sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.powerpc64.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
        sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/emptydb-upgrade/Tests/upgrade.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
        sql/test/mergetables/Tests/sqlsmith.Bug-6455.stable.out
        sql/test/subquery/Tests/subquery2.sql
        
sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.stable.out
        sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out
        sql/test/sys-schema/Tests/systemfunctions.stable.out
        sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
        sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade/Tests/upgrade.stable.out
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:

Merge with Nov2019 branch.


diffs (truncated from 4090 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
@@ -124,6 +124,7 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "max",  "command aggr.max(b:bat[:any_2]):any_2 ",       
"ALGmaxany;",   "Return the highest tail value or nil." ]
 [ "aggr",      "max",  "command aggr.max(b:bat[:any_2], skipnil:bit):any_2 ",  
"ALGmaxany_skipnil;",   "Return the highest tail value or nil." ]
 [ "aggr",      "median",       "command aggr.median(b:bat[:any_1]):any_1 ",    
"AGGRmedian;",  "Median aggregate"      ]
+[ "aggr",      "median_avg",   "command aggr.median_avg(b:bat[:any_1]):dbl ",  
"AGGRmedian_avg;",      "Median aggregate"      ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_1], g:bat[:oid], 
e:bat[:any_2]):bat[:any_1] ",     "AGGRmin3;",    ""      ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_2]):any_2 ",       
"ALGminany;",   "Return the lowest tail value or nil."  ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_2], skipnil:bit):any_2 ",  
"ALGminany_skipnil;",   "Return the lowest tail value or nil."  ]
@@ -209,6 +210,7 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid], 
nil_if_empty:bit):lng ",   "CMDBATprod;",  "Calculate aggregate product of B 
with candidate list." ]
 [ "aggr",      "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid], 
nil_if_empty:bit):sht ",   "CMDBATprod;",  "Calculate aggregate product of B 
with candidate list." ]
 [ "aggr",      "quantile",     "command aggr.quantile(b:bat[:any_1], 
q:bat[:dbl]):any_1 ",     "AGGRquantile;",        "Quantile aggregate"    ]
+[ "aggr",      "quantile_avg", "command aggr.quantile_avg(b:bat[:any_1], 
q:bat[:dbl]):dbl ",   "AGGRquantile_avg;",    "Quantile aggregate"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:bte], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on bte"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:dbl], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on dbl"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:flt], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on flt"    ]
@@ -310,6 +312,8 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "submax",       "command aggr.submax(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",      
"AGGRsubmaxcand_val;",  "Grouped maximum aggregate with candidates list"        
]
 [ "aggr",      "submedian",    "command aggr.submedian(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",        
"AGGRsubmedian;",       "Grouped median aggregate"      ]
 [ "aggr",      "submedian",    "command aggr.submedian(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",   
"AGGRsubmediancand;",   "Grouped median aggregate with candidate list"  ]
+[ "aggr",      "submedian_avg",        "command 
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], 
skip_nils:bit):bat[:dbl] ",      "AGGRsubmedian_avg;",   "Grouped median 
aggregate"      ]
+[ "aggr",      "submedian_avg",        "command 
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit):bat[:dbl] ", "AGGRsubmediancand_avg;",       "Grouped median 
aggregate with candidate list"  ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:oid] ",     "AGGRsubmin;",  
"Grouped minimum aggregate"     ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",   "AGGRsubmin_val;",  
    "Grouped minimum aggregate"     ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:oid] ",        
"AGGRsubmincand;",      "Grouped minimum aggregate with candidates list"        
]
@@ -342,6 +346,8 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "subprod",      "command aggr.subprod(b:bat[:sht], g:bat[:oid], 
e:bat[:any_1], s:bat[:oid], skip_nils:bit, abort_on_error:bit):bat[:sht] ",     
"AGGRsubprodcand_sht;", "Grouped product aggregate with candidates list"        
]
 [ "aggr",      "subquantile",  "command aggr.subquantile(b:bat[:any_1], 
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ", 
"AGGRsubquantile;",     "Grouped quantile aggregate"    ]
 [ "aggr",      "subquantile",  "command aggr.subquantile(b:bat[:any_1], 
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit):bat[:any_1] ",    "AGGRsubquantilecand;", "Grouped quantile 
aggregate with candidate list"        ]
+[ "aggr",      "subquantile_avg",      "command 
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2], 
skip_nils:bit):bat[:dbl] ",       "AGGRsubquantile_avg;", "Grouped quantile 
aggregate"    ]
+[ "aggr",      "subquantile_avg",      "command 
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2], 
s:bat[:oid], skip_nils:bit):bat[:dbl] ",  "AGGRsubquantilecand_avg;",     
"Grouped quantile aggregate with candidate list"        ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:bte], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:dbl], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:flt], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
@@ -11751,6 +11757,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "storage",      "pattern sql.storage(sname:str, tname:str, 
cname:str) (schema:bat[:str], table:bat[:str], column:bat[:str], 
type:bat[:str], mode:bat[:str], location:bat[:str], count:bat[:lng], 
atomwidth:bat[:int], columnsize:bat[:lng], heap:bat[:lng], hashes:bat[:lng], 
phash:bat[:bit], imprints:bat[:lng], sorted:bat[:bit], revsorted:bat[:bit], 
key:bat[:bit], orderidx:bat[:lng]) ", "sql_storage;", "return a table with 
storage information for a particular column"       ]
 [ "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",       "subnull",      "command sql.subnull(l:bat[:any_1], 
gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ",       "SQLnil_grp;",  "if 
any value in l is nil with in a group return true for that group, else false"   
    ]
 [ "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"      ]
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
@@ -132,6 +132,7 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "max",  "command aggr.max(b:bat[:any_2]):any_2 ",       
"ALGmaxany;",   "Return the highest tail value or nil." ]
 [ "aggr",      "max",  "command aggr.max(b:bat[:any_2], skipnil:bit):any_2 ",  
"ALGmaxany_skipnil;",   "Return the highest tail value or nil." ]
 [ "aggr",      "median",       "command aggr.median(b:bat[:any_1]):any_1 ",    
"AGGRmedian;",  "Median aggregate"      ]
+[ "aggr",      "median_avg",   "command aggr.median_avg(b:bat[:any_1]):dbl ",  
"AGGRmedian_avg;",      "Median aggregate"      ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_1], g:bat[:oid], 
e:bat[:any_2]):bat[:any_1] ",     "AGGRmin3;",    ""      ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_2]):any_2 ",       
"ALGminany;",   "Return the lowest tail value or nil."  ]
 [ "aggr",      "min",  "command aggr.min(b:bat[:any_2], skipnil:bit):any_2 ",  
"ALGminany_skipnil;",   "Return the lowest tail value or nil."  ]
@@ -246,6 +247,7 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid], 
nil_if_empty:bit):lng ",   "CMDBATprod;",  "Calculate aggregate product of B 
with candidate list." ]
 [ "aggr",      "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid], 
nil_if_empty:bit):sht ",   "CMDBATprod;",  "Calculate aggregate product of B 
with candidate list." ]
 [ "aggr",      "quantile",     "command aggr.quantile(b:bat[:any_1], 
q:bat[:dbl]):any_1 ",     "AGGRquantile;",        "Quantile aggregate"    ]
+[ "aggr",      "quantile_avg", "command aggr.quantile_avg(b:bat[:any_1], 
q:bat[:dbl]):dbl ",   "AGGRquantile_avg;",    "Quantile aggregate"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:bte], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on bte"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:dbl], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on dbl"    ]
 [ "aggr",      "stdev",        "command aggr.stdev(b:bat[:flt], g:bat[:oid], 
e:bat[:any_1]):bat[:dbl] ",       "AGGRstdev3_dbl;",      "Grouped tail 
standard deviation (sample/non-biased) on flt"    ]
@@ -355,6 +357,8 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "submax",       "command aggr.submax(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",      
"AGGRsubmaxcand_val;",  "Grouped maximum aggregate with candidates list"        
]
 [ "aggr",      "submedian",    "command aggr.submedian(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",        
"AGGRsubmedian;",       "Grouped median aggregate"      ]
 [ "aggr",      "submedian",    "command aggr.submedian(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",   
"AGGRsubmediancand;",   "Grouped median aggregate with candidate list"  ]
+[ "aggr",      "submedian_avg",        "command 
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], 
skip_nils:bit):bat[:dbl] ",      "AGGRsubmedian_avg;",   "Grouped median 
aggregate"      ]
+[ "aggr",      "submedian_avg",        "command 
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit):bat[:dbl] ", "AGGRsubmediancand_avg;",       "Grouped median 
aggregate with candidate list"  ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:oid] ",     "AGGRsubmin;",  
"Grouped minimum aggregate"     ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",   "AGGRsubmin_val;",  
    "Grouped minimum aggregate"     ]
 [ "aggr",      "submin",       "command aggr.submin(b:bat[:any_1], 
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:oid] ",        
"AGGRsubmincand;",      "Grouped minimum aggregate with candidates list"        
]
@@ -397,6 +401,8 @@ stdout of test 'MAL-signatures` in direc
 [ "aggr",      "subprod",      "command aggr.subprod(b:bat[:sht], g:bat[:oid], 
e:bat[:any_1], s:bat[:oid], skip_nils:bit, abort_on_error:bit):bat[:sht] ",     
"AGGRsubprodcand_sht;", "Grouped product aggregate with candidates list"        
]
 [ "aggr",      "subquantile",  "command aggr.subquantile(b:bat[:any_1], 
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ", 
"AGGRsubquantile;",     "Grouped quantile aggregate"    ]
 [ "aggr",      "subquantile",  "command aggr.subquantile(b:bat[:any_1], 
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit):bat[:any_1] ",    "AGGRsubquantilecand;", "Grouped quantile 
aggregate with candidate list"        ]
+[ "aggr",      "subquantile_avg",      "command 
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2], 
skip_nils:bit):bat[:dbl] ",       "AGGRsubquantile_avg;", "Grouped quantile 
aggregate"    ]
+[ "aggr",      "subquantile_avg",      "command 
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2], 
s:bat[:oid], skip_nils:bit):bat[:dbl] ",  "AGGRsubquantilecand_avg;",     
"Grouped quantile aggregate with candidate list"        ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:bte], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:dbl], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
 [ "aggr",      "substdev",     "command aggr.substdev(b:bat[:flt], 
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ", 
"AGGRsubstdev_dbl;",    "Grouped standard deviation (sample/non-biased) 
aggregate"      ]
@@ -16163,6 +16169,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "storage",      "pattern sql.storage(sname:str, tname:str, 
cname:str) (schema:bat[:str], table:bat[:str], column:bat[:str], 
type:bat[:str], mode:bat[:str], location:bat[:str], count:bat[:lng], 
atomwidth:bat[:int], columnsize:bat[:lng], heap:bat[:lng], hashes:bat[:lng], 
phash:bat[:bit], imprints:bat[:lng], sorted:bat[:bit], revsorted:bat[:bit], 
key:bat[:bit], orderidx:bat[:lng]) ", "sql_storage;", "return a table with 
storage information for a particular column"       ]
 [ "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",       "subnull",      "command sql.subnull(l:bat[:any_1], 
gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ",       "SQLnil_grp;",  "if 
any value in l is nil with in a group return true for that group, else false"   
    ]
 [ "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):hge ",    
"SQLsum;",      "return the sum of groups"      ]
 [ "sql",       "sum",  "pattern sql.sum(b:bte, s:lng, e:lng):lng ",    
"SQLsum;",      "return the sum of groups"      ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -127,9 +127,11 @@ gdk_return BATgroupavg(BAT **bnp, BAT **
 BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, 
bool abort_on_error);
 BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool 
abort_on_error);
 BAT *BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, 
bool abort_on_error);
+BAT *BATgroupmedian_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool 
skip_nils, bool abort_on_error);
 BAT *BATgroupmin(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool 
abort_on_error);
 BAT *BATgroupprod(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool 
abort_on_error);
 BAT *BATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile, 
bool skip_nils, bool abort_on_error);
+BAT *BATgroupquantile_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double 
quantile, bool skip_nils, bool abort_on_error);
 BAT *BATgroupsize(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool 
abort_on_error);
 BAT *BATgroupstdev_population(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool 
skip_nils, bool abort_on_error);
 BAT *BATgroupstdev_sample(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool 
skip_nils, bool abort_on_error);
@@ -615,6 +617,7 @@ str AGGRcount3nils(bat *retval, const ba
 str AGGRcount3nonils(bat *retval, const bat *bid, const bat *gid, const bat 
*eid);
 str AGGRmax3(bat *retval, const bat *bid, const bat *gid, const bat *eid);
 str AGGRmedian(void *retval, const bat *bid);
+str AGGRmedian_avg(dbl *retval, const bat *bid);
 str AGGRmin3(bat *retval, const bat *bid, const bat *gid, const bat *eid);
 str AGGRprod3_bte(bat *retval, const bat *bid, const bat *gid, const bat *eid);
 str AGGRprod3_dbl(bat *retval, const bat *bid, const bat *gid, const bat *eid);
@@ -624,6 +627,7 @@ str AGGRprod3_int(bat *retval, const bat
 str AGGRprod3_lng(bat *retval, const bat *bid, const bat *gid, const bat *eid);
 str AGGRprod3_sht(bat *retval, const bat *bid, const bat *gid, const bat *eid);
 str AGGRquantile(void *retval, const bat *bid, const bat *qid);
+str AGGRquantile_avg(dbl *retval, const bat *bid, const bat *qid);
 str AGGRstdev3_dbl(bat *retval, const bat *bid, const bat *gid, const bat 
*eid);
 str AGGRstdevp3_dbl(bat *retval, const bat *bid, const bat *gid, const bat 
*eid);
 str AGGRstr_group_concat(bat *retval, const bat *bid, const bat *gid, const 
bat *eid);
@@ -643,7 +647,9 @@ str AGGRsubmax_val(bat *retval, const ba
 str AGGRsubmaxcand(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils);
 str AGGRsubmaxcand_val(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils);
 str AGGRsubmedian(bat *retval, const bat *bid, const bat *gid, const bat *eid, 
const bit *skip_nils);
+str AGGRsubmedian_avg(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bit *skip_nils);
 str AGGRsubmediancand(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils);
+str AGGRsubmediancand_avg(bat *retval, const bat *bid, const bat *gid, const 
bat *eid, const bat *sid, const bit *skip_nils);
 str AGGRsubmin(bat *retval, const bat *bid, const bat *gid, const bat *eid, 
const bit *skip_nils);
 str AGGRsubmin_val(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bit *skip_nils);
 str AGGRsubmincand(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils);
@@ -663,7 +669,9 @@ str AGGRsubprodcand_int(bat *retval, con
 str AGGRsubprodcand_lng(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
 str AGGRsubprodcand_sht(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
 str AGGRsubquantile(bat *retval, const bat *bid, const bat *quantile, const 
bat *gid, const bat *eid, const bit *skip_nils);
+str AGGRsubquantile_avg(bat *retval, const bat *bid, const bat *quantile, 
const bat *gid, const bat *eid, const bit *skip_nils);
 str AGGRsubquantilecand(bat *retval, const bat *bid, const bat *quantile, 
const bat *gid, const bat *eid, const bat *sid, const bit *skip_nils);
+str AGGRsubquantilecand_avg(bat *retval, const bat *bid, const bat *quantile, 
const bat *gid, const bat *eid, const bat *sid, const bit *skip_nils);
 str AGGRsubstdev_dbl(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bit *skip_nils, const bit *abort_on_error);
 str AGGRsubstdevcand_dbl(bat *retval, const bat *bid, const bat *gid, const 
bat *eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
 str AGGRsubstdevp_dbl(bat *retval, const bat *bid, const bat *gid, const bat 
*eid, const bit *skip_nils, const bit *abort_on_error);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2704,13 +2704,6 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
 /* ---------------------------------------------------------------------- */
 /* quantiles/median */
 
-BAT *
-BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp,
-              bool skip_nils, bool abort_on_error)
-{
-       return BATgroupquantile(b,g,e,s,tp,0.5,skip_nils,abort_on_error);
-}
-
 #if SIZEOF_OID == SIZEOF_INT
 #define binsearch_oid(indir, offset, vals, lo, hi, v, ordering, last) 
binsearch_int(indir, offset, (const int *) vals, lo, hi, (int) (v), ordering, 
last)
 #endif
@@ -2718,9 +2711,9 @@ BATgroupmedian(BAT *b, BAT *g, BAT *e, B
 #define binsearch_oid(indir, offset, vals, lo, hi, v, ordering, last) 
binsearch_lng(indir, offset, (const lng *) vals, lo, hi, (lng) (v), ordering, 
last)
 #endif
 
-BAT *
-BATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
-                bool skip_nils, bool abort_on_error)
+static BAT *
+doBATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
+                  bool skip_nils, bool abort_on_error, bool average)
 {
        bool freeb = false, freeg = false;
        oid min, max;
@@ -2733,10 +2726,30 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
        BATiter bi;
        const void *v;
        const void *nil = ATOMnilptr(tp);
+       const void *dnil = nil;
+       dbl val;                /* only used for average */
        int (*atomcmp)(const void *, const void *) = ATOMcompare(tp);
        const char *err;
        (void) abort_on_error;
 
+       if (average) {
+               switch (ATOMbasetype(b->ttype)) {
+               case TYPE_bte:
+               case TYPE_sht:
+               case TYPE_int:
+               case TYPE_lng:
+#ifdef HAVE_HGE
+               case TYPE_hge:
+#endif
+               case TYPE_flt:
+               case TYPE_dbl:
+                       break;
+               default:
+                       GDKerror("BATgroupquantile: incompatible type\n");
+                       return NULL;
+               }
+               dnil = &dbl_nil;
+       }
        if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci, 
&ncand)) != NULL) {
                GDKerror("BATgroupquantile: %s\n", err);
                return NULL;
@@ -2757,7 +2770,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                /* trivial: no values, thus also no quantiles,
                 * so return bat aligned with e with nil in the tail
                 * The same happens for a NULL quantile */
-               return BATconstant(ngrp == 0 ? 0 : min, tp, nil, ngrp, 
TRANSIENT);
+               return BATconstant(ngrp == 0 ? 0 : min, average ? TYPE_dbl : 
tp, dnil, ngrp, TRANSIENT);
        }
 
        if (s) {
@@ -2786,7 +2799,10 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                if (BATtdense(g)) {
                        /* singleton groups, so calculating quantile is
                         * easy */
-                       bn = COLcopy(b, tp, false, TRANSIENT);
+                       if (average)
+                               bn = BATconvert(b, NULL, TYPE_dbl, 
abort_on_error);
+                       else
+                               bn = COLcopy(b, tp, false, TRANSIENT);
                        BAThseqbase(bn, g->tseqbase); /* deals with NULL */
                        if (freeb)
                                BBPunfix(b->batCacheid);
@@ -2811,7 +2827,10 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                freeb = true;
                BBPunfix(t2->batCacheid);
 
-               bn = COLnew(min, tp, ngrp, TRANSIENT);
+               if (average)
+                       bn = COLnew(min, TYPE_dbl, ngrp, TRANSIENT);
+               else
+                       bn = COLnew(min, tp, ngrp, TRANSIENT);
                if (bn == NULL)
                        goto bunins_failed;
 
@@ -2835,8 +2854,38 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                        }
                        if (r == p) {
                                /* no non-nils found */
-                               v = nil;
+                               v = dnil;
                                nils++;
+                       } else if (average) {
+                               double f = (p - r - 1) * quantile;
+                               double lo = floor(f);
+                               double hi = ceil(f);
+                               switch (ATOMbasetype(tp)) {
+                               case TYPE_bte:
+                                       val = (f - lo) * *(bte*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(bte*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+                               case TYPE_sht:
+                                       val = (f - lo) * *(sht*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(sht*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+                               case TYPE_int:
+                                       val = (f - lo) * *(int*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(int*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+                               case TYPE_lng:
+                                       val = (f - lo) * *(lng*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(lng*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+#ifdef HAVE_HGE
+                               case TYPE_hge:
+                                       val = (f - lo) * *(hge*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(hge*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+#endif
+                               case TYPE_flt:
+                                       val = (f - lo) * *(flt*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(flt*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+                               case TYPE_dbl:
+                                       val = (f - lo) * *(dbl*)BUNtail(bi, r + 
(BUN) hi) + (lo + 1 - f) * *(dbl*)BUNtail(bi, r + (BUN) lo);
+                                       break;
+                               }
+                               v = &val;
                        } else {
                                /* round *down* to nearest integer */
                                double f = (p - r - 1) * quantile;
@@ -2845,13 +2894,13 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                                assert(qindex >= r && qindex <  p);
                                v = BUNtail(bi, qindex);
                                if (!skip_nils && !b->tnonil)
-                                       nils += (*atomcmp)(v, nil) == 0;
+                                       nils += (*atomcmp)(v, dnil) == 0;
                        }
                        bunfastapp_nocheck(bn, BUNlast(bn), v, Tsize(bn));
                }
                nils += ngrp - BATcount(bn);
                while (BATcount(bn) < ngrp) {
-                       bunfastapp_nocheck(bn, BUNlast(bn), nil, Tsize(bn));
+                       bunfastapp_nocheck(bn, BUNlast(bn), dnil, Tsize(bn));
                }
                bn->theap.dirty = true;
                BBPunfix(g->batCacheid);
@@ -2860,7 +2909,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                BAT *pb = NULL;
                const oid *ords;
 
-               bn = COLnew(0, tp, 1, TRANSIENT);
+               bn = COLnew(0, average ? TYPE_dbl : tp, 1, TRANSIENT);
                if (bn == NULL)
                        goto bunins_failed;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to