Changeset: 2031db0dea18 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2031db0dea18
Added Files:
sql/include/sql_querytype.h
sql/server/rel_unnest.c
sql/server/rel_unnest.h
sql/server/sql_query.c
sql/server/sql_query.h
sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.err
sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
sql/test/subquery/Tests/All
sql/test/subquery/Tests/all.stable.err
sql/test/subquery/Tests/all.stable.out
sql/test/subquery/Tests/any.stable.err
sql/test/subquery/Tests/any.stable.out
sql/test/subquery/Tests/any_all.stable.err
sql/test/subquery/Tests/any_all.stable.out
sql/test/subquery/Tests/correlated.sql
sql/test/subquery/Tests/correlated.stable.err
sql/test/subquery/Tests/correlated.stable.out
sql/test/subquery/Tests/scalar.stable.err
sql/test/subquery/Tests/scalar.stable.out
sql/test/subquery/Tests/subquery.sql
sql/test/subquery/Tests/subquery.stable.err
sql/test/subquery/Tests/subquery.stable.out
sql/test/subquery/Tests/subquery2.sql
sql/test/subquery/Tests/subquery2.stable.err
sql/test/subquery/Tests/subquery2.stable.out
Removed Files:
sql/include/sql_query.h
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
gdk/gdk.h
gdk/gdk_aggr.c
gdk/gdk_batop.c
gdk/gdk_calc.h
gdk/gdk_join.c
gdk/gdk_logger.c
monetdb5/mal/mal_authorize.c
monetdb5/modules/kernel/algebra.c
monetdb5/modules/kernel/algebra.h
monetdb5/modules/kernel/algebra.mal
monetdb5/optimizer/opt_mergetable.c
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_bat2time.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_rank.mal
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out
sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out
sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
sql/benchmarks/tpcds/Tests/09.stable.out
sql/common/sql_stack.c
sql/common/sql_types.c
sql/include/Makefile.ag
sql/include/sql_catalog.h
sql/include/sql_relation.h
sql/include/sql_stack.h
sql/odbc/samples/Tests/testgetinfo.stable.err
sql/rel.txt
sql/server/Makefile.ag
sql/server/rel_distribute.c
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_partition.c
sql/server/rel_propagate.c
sql/server/rel_propagate.h
sql/server/rel_psm.c
sql/server/rel_psm.h
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_schema.c
sql/server/rel_schema.h
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/rel_semantic.c
sql/server/rel_semantic.h
sql/server/rel_sequence.c
sql/server/rel_sequence.h
sql/server/rel_trans.c
sql/server/rel_trans.h
sql/server/rel_updates.c
sql/server/rel_updates.h
sql/server/rel_xml.c
sql/server/rel_xml.h
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/server/sql_parser.y
sql/server/sql_partition.c
sql/server/sql_semantic.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/store.c
sql/test/BugTracker-2009/Tests/correlated-selection-bug.stable.out
sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
sql/test/BugTracker-2011/Tests/aggregate-in-subquery.Bug-2739.stable.out
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
sql/test/BugTracker-2012/Tests/correlated_groupby_in_selection.Bug-3011.stable.out
sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
sql/test/BugTracker-2013/Tests/correlated_select.Bug-3250.stable.out
sql/test/BugTracker-2013/Tests/correlated_subquery.Bug-3317.stable.out
sql/test/BugTracker-2013/Tests/pivot.Bug-3339.stable.err
sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.err
sql/test/BugTracker-2013/Tests/syntaxerror.Bug-3399.stable.out
sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.stable.err
sql/test/BugTracker-2014/Tests/order_by_incorrect_error.Bug-3630.stable.err
sql/test/BugTracker-2014/Tests/order_by_incorrect_error.Bug-3630.stable.out
sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out
sql/test/BugTracker-2015/Tests/ambiguous.Bug-3803.stable.out.int128
sql/test/BugTracker-2015/Tests/apply_merge_distinct.Bug-3760.stable.out
sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
sql/test/BugTracker-2016/Tests/DISTINCT_with_correlated_scalar_subquery_crashes_mserver.Bug-3920.stable.out
sql/test/BugTracker-2016/Tests/LEFT-JOIN_with_OR_conditions_triggers_assertion.Bug-3908.stable.out
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out
sql/test/BugTracker-2016/Tests/nested-subquery-in-select.Bug-6125.stable.out
sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err
sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err
sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_not_in_select.Bug-6290.stable.out
sql/test/BugTracker-2017/Tests/exist-bigint-missing.Bug-6315.stable.out
sql/test/BugTracker-2017/Tests/exists.Bug-6392.stable.out
sql/test/BugTracker-2017/Tests/groupby_assertion.Bug-6338.stable.out
sql/test/BugTracker-2017/Tests/lateral.Bug-6310.sql
sql/test/BugTracker-2017/Tests/lateral.Bug-6310.stable.err
sql/test/BugTracker-2017/Tests/lateral.Bug-6310.stable.out
sql/test/BugTracker-2017/Tests/limit.Bug-6322.stable.out
sql/test/BugTracker-2017/Tests/push_subslice.Bug-6322.stable.out
sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.err
sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out
sql/test/BugTracker-2017/Tests/udf_crash_subquery_scalar_paramters.Bug-6399.stable.err
sql/test/BugTracker-2017/Tests/wrong_aggregation_count.Bug-6257.stable.out
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
sql/test/BugTracker-2018/Tests/local_replica_table_not_detected.Bug-6620.stable.out
sql/test/BugTracker-2019/Tests/subselect-count.Bug-6686.stable.out
sql/test/BugTracker/Tests/bug_in_selection.SF-1892413.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-0join-query.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-1join-query.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-1join-view.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.stable.out
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-view.stable.out
sql/test/SQLite_regress/sqllogictest/Tests/select1.test.stable.out
sql/test/SQLite_regress/sqllogictest/Tests/select1.test.stable.out.int128
sql/test/SQLite_regress/sqllogictest/Tests/select2.test.stable.out
sql/test/SQLite_regress/sqllogictest/Tests/select2.test.stable.out.int128
sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out
sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out.int128
sql/test/Tests/marcin1.stable.out
sql/test/Tests/order_by_complex_exp.stable.out
sql/test/Tests/outerref_in_selection.stable.out
sql/test/Tests/outerref_in_selection.stable.out.int128
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
sql/test/VOC/Tests/VOC.stable.out
sql/test/analytics/Tests/analytics09.stable.err
sql/test/analytics/Tests/analytics09.stable.out
sql/test/bugs/Tests/in_or_bug.stable.out
sql/test/bugs/Tests/selectlist_subquery-sf-1208599.stable.out
sql/test/bugs/Tests/zero_or_one_bug.stable.out
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/in-value-list/Tests/various-in-value-list-queries.stable.out
sql/test/lateral/Tests/lateral.stable.out
sql/test/mergetables/Tests/part-elim.stable.out
sql/test/mergetables/Tests/sqlsmith.Bug-6459.stable.out
sql/test/mergetables/Tests/sqlsmith.Bug-6459.stable.out.int128
sql/test/miscellaneous/Tests/groupby_expressions.stable.err
sql/test/null/Tests/coalesce.stable.out
sql/test/null/Tests/coalesce3.stable.out
sql/test/pg_regress/Tests/vacuum.stable.out
sql/test/sql_xml/Tests/xml.stable.out
sql/test/sys-schema/Tests/bam_tables_checks.stable.out
sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out
Branch: default
Log Message:
Merge subquery branch into default.
diffs (truncated from 71996 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
@@ -66,6 +66,8 @@ stdout of test 'MAL-signatures` in direc
% module, function, signature, address, comment # name
% clob, clob, clob, clob, clob # type
% 11, 28, 364, 44, 874 # length
+[ "aggr", "allnotequal", "command aggr.allnotequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLallnotequal;", "if all values in r are not
equal to l return true, else if r has nil nil else false" ]
+[ "aggr", "anyequal", "command aggr.anyequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLanyequal;", "if any value in r is equal to l
return true, else if r has nil nil else false" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
bte" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
dbl" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
flt" ]
@@ -121,9 +123,11 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "jsonaggr", "command aggr.jsonaggr(val:bat[:str]):str ",
"JSONgroupStr;", "Aggregate the string values to array." ]
[ "aggr", "max", "command aggr.max(b:bat[:any_1], g:bat[:oid],
e:bat[:any_2]):bat[:any_1] ", "AGGRmax3;", "" ]
[ "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", "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." ]
[ "aggr", "prod", "command aggr.prod(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:bte] ", "AGGRprod3_bte;", "Grouped tail
product on bte" ]
[ "aggr", "prod", "command aggr.prod(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "Grouped tail
product on dbl" ]
[ "aggr", "prod", "command aggr.prod(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "Grouped tail
product on flt" ]
@@ -230,6 +234,10 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], nil_if_empty:bit):str ",
"CMDBATstr_group_concat;", "Calculate aggregate string concatenate of B
with separator SEP." ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], s:bat[:oid]):str ",
"CMDBATstr_group_concat;", "Calculate aggregate string concatenate of B
with candidate list and separator SEP." ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], s:bat[:oid],
nil_if_empty:bit):str ", "CMDBATstr_group_concat;", "Calculate
aggregate string concatenate of B with candidate list and separator SEP." ]
+[ "aggr", "suballnotequal", "command
aggr.suballnotequal(l:bat[:any_1], r:bat[:any_1], rid:bat[:oid], gp:bat[:oid],
gpe:bat[:oid], no_nil:bit):bat[:bit] ", "SQLallnotequal_grp2;", "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true" ]
+[ "aggr", "suballnotequal", "command
aggr.suballnotequal(l:bat[:any_1], r:bat[:any_1], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:bit] ", "SQLallnotequal_grp;", "if all values in r are
not equal to l return true, else if r has nil nil else false" ]
+[ "aggr", "subanyequal", "command aggr.subanyequal(l:bat[:any_1],
r:bat[:any_1], rid:bat[:oid], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:bit] ", "SQLanyequal_grp2;", "if any value in r is equal
to l return true, else if r has nil nil else false, except if rid is nil (ie
empty) then false" ]
+[ "aggr", "subanyequal", "command aggr.subanyequal(l:bat[:any_1],
r:bat[:any_1], gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ",
"SQLanyequal_grp;", "if any value in r is equal to l return true, else if r
has nil nil else false" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:bte], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:flt], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
@@ -292,6 +300,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:int],
e2:bat[:int], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:lng],
e2:bat[:lng], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:sht],
e2:bat[:sht], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
+[ "aggr", "subexist", "command aggr.subexist(b:bat[:any_2],
g:bat[:oid], e:bat[:oid], no_nil:bit):bat[:bit] ", "SQLsubexist;", ""
]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:dbl],
g:bat[:oid], e:bat[:any_1], skip_nils:bit):bat[:str] ", "JSONsubjson;",
"Grouped aggregation of values." ]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:str],
g:bat[:oid], e:bat[:any_1], skip_nils:bit):bat[:str] ", "JSONsubjson;",
"Grouped aggregation of values." ]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:dbl],
g:bat[:oid], e:bat[:any_1], s:bat[:oid], skip_nils:bit):bat[:str] ",
"JSONsubjsoncand;", "Grouped aggregation of values with candidates list."
]
@@ -520,7 +529,7 @@ stdout of test 'MAL-signatures` in direc
[ "algebra", "bandjoin", "command algebra.bandjoin(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], c1:any_1, c2:any_1, li:bit, hi:bit,
estimate:lng) (X_0:bat[:oid], X_1:bat[:oid]) ", "ALGbandjoin;", "Band join:
values in l and r match if r - c1 <[=] l <[=] r + c2" ]
[ "algebra", "copy", "command algebra.copy(b:bat[:any_1]):bat[:any_1] ",
"ALGcopy;", "Returns physical copy of a BAT." ]
[ "algebra", "crossproduct", "command algebra.crossproduct(left:bat[:any_1],
right:bat[:any_2]) (l:bat[:oid], r:bat[:oid]) ", "ALGcrossproduct2;",
"Returns 2 columns with all BUNs, consisting of the head-oids\n\t from 'left'
and 'right' for which there are BUNs in 'left'\n\t and 'right' with equal
tails" ]
-[ "algebra", "difference", "command algebra.difference(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit,
estimate:lng):bat[:oid] ", "ALGdifference;", "Difference of l and r
with candidate lists" ]
+[ "algebra", "difference", "command algebra.difference(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, nil_clears:bit,
estimate:lng):bat[:oid] ", "ALGdifference;", "Difference of l and r
with candidate lists" ]
[ "algebra", "exist", "command algebra.exist(b:bat[:any_1],
val:any_1):bit ", "ALGexist;", "Returns whether 'val' occurs in b." ]
[ "algebra", "fetch", "command algebra.fetch(b:bat[:any_1],
x:oid):any_1 ", "ALGfetchoid;", "Returns the value of the BUN at x-th
position with 0 <= x < b.count" ]
[ "algebra", "find", "command algebra.find(b:bat[:any_1], t:any_1):oid ",
"ALGfind;", "Returns the index position of a value. If no such BUN exists
return OID-nil." ]
@@ -11630,12 +11639,14 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "abort", "pattern sql.abort():void ", "SQLabort;",
"Trigger the abort operation for a MAL block" ]
[ "sql", "affectedRows", "unsafe pattern sql.affectedRows(mvc:int,
nr:lng):int ", "mvc_affected_rows_wrap;", "export the number of
affected rows by the current query" ]
[ "sql", "all", "inline function sql.all(b:bat[:any_1], gp:bat[:oid],
gpe:bat[:oid], no_nil:bit):bat[:any_1];", "", "" ]
-[ "sql", "all", "command sql.all(col:bat[:any_1]):any_1 ",
"SQLall;", "if col contains exactly one value return this. Incase of more
raise an exception else return nil" ]
+[ "sql", "all", "command sql.all(col:bat[:any_1]):any_1 ",
"SQLall;", "if all values in col are equal return this, else nil" ]
+[ "sql", "all", "command sql.all(cmp:bit, nl:bit, nr:bit):bit ",
"SQLall_cmp;", "if !cmp then false, (nl or nr) then nil, else true" ]
[ "sql", "alpha", "command sql.alpha(dec:dbl, theta:dbl):dbl ",
"SQLcst_alpha_cst;", "Implementation of astronomy alpha function: expands
the radius theta depending on the declination" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int,
sample:lng):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str, tbl:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str, tbl:str, col:str):void ", "sql_analyze;", "Update the database
statistics table" ]
+[ "sql", "any", "command sql.any(cmp:bit, nl:bit, nr:bit):bit ",
"SQLany_cmp;", "if cmp then true, (nl or nr) nil then nil, else false" ]
[ "sql", "append", "pattern sql.append(mvc:int, sname:str,
tname:str, cname:str, ins:any):int ", "mvc_append_wrap;", "Append to the
column tname.cname (possibly optimized to replace the insert bat of
tname.cname. Returns sequence number for order dependence." ]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "Glue together the calling sequence" ]
[ "sql", "argRecord", "pattern sql.argRecord(a:any...):str ",
"SQLargRecord;", "Glue together the calling sequence" ]
@@ -11741,6 +11752,7 @@ stdout of test 'MAL-signatures` in direc
[ "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", "null", "command sql.null(b:bat[:any_1]):bit ", "SQLnil;",
"if b has a nil return true, else false" ]
[ "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" ]
@@ -11840,6 +11852,8 @@ stdout of test 'MAL-signatures` in direc
[ "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" ]
+[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1],
err:bit):any_1 ", "zero_or_one_error;", "if col contains exactly one
value return this. Incase of more raise an exception if err is true else return
nil" ]
+[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1],
err:bat[:bit]):any_1 ", "zero_or_one_error_bat;", "if col contains
exactly one value return this. Incase of more raise an exception if err is true
else return nil" ]
[ "sqlcatalog", "alter_add_range_partition", "pattern
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str,
ptnme:str, min:any_1, max:any_1, nills:int, update:int):void ",
"SQLalter_add_range_partition;", "Catalog operation
alter_add_range_partition" ]
[ "sqlcatalog", "alter_add_table", "pattern
sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str,
action:int):void ", "SQLalter_add_table;", "Catalog operation
alter_add_table" ]
[ "sqlcatalog", "alter_add_value_partition", "pattern
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str,
ptnme:str, nills:int, update:int):void ",
"SQLalter_add_value_partition;", "Catalog operation
alter_add_value_partition" ]
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
@@ -70,6 +70,8 @@ stdout of test 'MAL-signatures` in direc
% module, function, signature, address, comment # name
% clob, clob, clob, clob, clob # type
% 11, 28, 364, 44, 874 # length
+[ "aggr", "allnotequal", "command aggr.allnotequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLallnotequal;", "if all values in r are not
equal to l return true, else if r has nil nil else false" ]
+[ "aggr", "anyequal", "command aggr.anyequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLanyequal;", "if any value in r is equal to l
return true, else if r has nil nil else false" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
bte" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
dbl" ]
[ "aggr", "avg", "command aggr.avg(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "Grouped tail average on
flt" ]
@@ -129,9 +131,11 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "jsonaggr", "command aggr.jsonaggr(val:bat[:str]):str ",
"JSONgroupStr;", "Aggregate the string values to array." ]
[ "aggr", "max", "command aggr.max(b:bat[:any_1], g:bat[:oid],
e:bat[:any_2]):bat[:any_1] ", "AGGRmax3;", "" ]
[ "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", "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." ]
[ "aggr", "prod", "command aggr.prod(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:bte] ", "AGGRprod3_bte;", "Grouped tail
product on bte" ]
[ "aggr", "prod", "command aggr.prod(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "Grouped tail
product on dbl" ]
[ "aggr", "prod", "command aggr.prod(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRprod3_dbl;", "Grouped tail
product on flt" ]
@@ -269,6 +273,10 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], nil_if_empty:bit):str ",
"CMDBATstr_group_concat;", "Calculate aggregate string concatenate of B
with separator SEP." ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], s:bat[:oid]):str ",
"CMDBATstr_group_concat;", "Calculate aggregate string concatenate of B
with candidate list and separator SEP." ]
[ "aggr", "str_group_concat", "pattern
aggr.str_group_concat(b:bat[:str], sep:bat[:str], s:bat[:oid],
nil_if_empty:bit):str ", "CMDBATstr_group_concat;", "Calculate
aggregate string concatenate of B with candidate list and separator SEP." ]
+[ "aggr", "suballnotequal", "command
aggr.suballnotequal(l:bat[:any_1], r:bat[:any_1], rid:bat[:oid], gp:bat[:oid],
gpe:bat[:oid], no_nil:bit):bat[:bit] ", "SQLallnotequal_grp2;", "if all values
in r are not equal to l return true, else if r has nil nil else false, except
if rid is nil (ie empty) then true" ]
+[ "aggr", "suballnotequal", "command
aggr.suballnotequal(l:bat[:any_1], r:bat[:any_1], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:bit] ", "SQLallnotequal_grp;", "if all values in r are
not equal to l return true, else if r has nil nil else false" ]
+[ "aggr", "subanyequal", "command aggr.subanyequal(l:bat[:any_1],
r:bat[:any_1], rid:bat[:oid], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:bit] ", "SQLanyequal_grp2;", "if any value in r is equal
to l return true, else if r has nil nil else false, except if rid is nil (ie
empty) then false" ]
+[ "aggr", "subanyequal", "command aggr.subanyequal(l:bat[:any_1],
r:bat[:any_1], gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ",
"SQLanyequal_grp;", "if any value in r is equal to l return true, else if r
has nil nil else false" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:bte], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
[ "aggr", "subavg", "command aggr.subavg(b:bat[:flt], g:bat[:oid],
e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubavg1_dbl;", "Grouped average aggregate" ]
@@ -337,6 +345,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:int],
e2:bat[:int], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:lng],
e2:bat[:lng], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
[ "aggr", "subcovar", "function aggr.subcovar(e1:bat[:sht],
e2:bat[:sht], g:bat[:oid], e:bat[:any_2], f:bit):bat[:dbl];", "", ""
]
+[ "aggr", "subexist", "command aggr.subexist(b:bat[:any_2],
g:bat[:oid], e:bat[:oid], no_nil:bit):bat[:bit] ", "SQLsubexist;", ""
]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:dbl],
g:bat[:oid], e:bat[:any_1], skip_nils:bit):bat[:str] ", "JSONsubjson;",
"Grouped aggregation of values." ]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:str],
g:bat[:oid], e:bat[:any_1], skip_nils:bit):bat[:str] ", "JSONsubjson;",
"Grouped aggregation of values." ]
[ "aggr", "subjsonaggr", "command aggr.subjsonaggr(val:bat[:dbl],
g:bat[:oid], e:bat[:any_1], s:bat[:oid], skip_nils:bit):bat[:str] ",
"JSONsubjsoncand;", "Grouped aggregation of values with candidates list."
]
@@ -624,7 +633,7 @@ stdout of test 'MAL-signatures` in direc
[ "algebra", "bandjoin", "command algebra.bandjoin(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], c1:any_1, c2:any_1, li:bit, hi:bit,
estimate:lng) (X_0:bat[:oid], X_1:bat[:oid]) ", "ALGbandjoin;", "Band join:
values in l and r match if r - c1 <[=] l <[=] r + c2" ]
[ "algebra", "copy", "command algebra.copy(b:bat[:any_1]):bat[:any_1] ",
"ALGcopy;", "Returns physical copy of a BAT." ]
[ "algebra", "crossproduct", "command algebra.crossproduct(left:bat[:any_1],
right:bat[:any_2]) (l:bat[:oid], r:bat[:oid]) ", "ALGcrossproduct2;",
"Returns 2 columns with all BUNs, consisting of the head-oids\n\t from 'left'
and 'right' for which there are BUNs in 'left'\n\t and 'right' with equal
tails" ]
-[ "algebra", "difference", "command algebra.difference(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit,
estimate:lng):bat[:oid] ", "ALGdifference;", "Difference of l and r
with candidate lists" ]
+[ "algebra", "difference", "command algebra.difference(l:bat[:any_1],
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, nil_clears:bit,
estimate:lng):bat[:oid] ", "ALGdifference;", "Difference of l and r
with candidate lists" ]
[ "algebra", "exist", "command algebra.exist(b:bat[:any_1],
val:any_1):bit ", "ALGexist;", "Returns whether 'val' occurs in b." ]
[ "algebra", "fetch", "command algebra.fetch(b:bat[:any_1],
x:oid):any_1 ", "ALGfetchoid;", "Returns the value of the BUN at x-th
position with 0 <= x < b.count" ]
[ "algebra", "find", "command algebra.find(b:bat[:any_1], t:any_1):oid ",
"ALGfind;", "Returns the index position of a value. If no such BUN exists
return OID-nil." ]
@@ -16042,12 +16051,14 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "abort", "pattern sql.abort():void ", "SQLabort;",
"Trigger the abort operation for a MAL block" ]
[ "sql", "affectedRows", "unsafe pattern sql.affectedRows(mvc:int,
nr:lng):int ", "mvc_affected_rows_wrap;", "export the number of
affected rows by the current query" ]
[ "sql", "all", "inline function sql.all(b:bat[:any_1], gp:bat[:oid],
gpe:bat[:oid], no_nil:bit):bat[:any_1];", "", "" ]
-[ "sql", "all", "command sql.all(col:bat[:any_1]):any_1 ",
"SQLall;", "if col contains exactly one value return this. Incase of more
raise an exception else return nil" ]
+[ "sql", "all", "command sql.all(col:bat[:any_1]):any_1 ",
"SQLall;", "if all values in col are equal return this, else nil" ]
+[ "sql", "all", "command sql.all(cmp:bit, nl:bit, nr:bit):bit ",
"SQLall_cmp;", "if !cmp then false, (nl or nr) then nil, else true" ]
[ "sql", "alpha", "command sql.alpha(dec:dbl, theta:dbl):dbl ",
"SQLcst_alpha_cst;", "Implementation of astronomy alpha function: expands
the radius theta depending on the declination" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int,
sample:lng):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str, tbl:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "pattern sql.analyze(minmax:int, sample:lng,
sch:str, tbl:str, col:str):void ", "sql_analyze;", "Update the database
statistics table" ]
+[ "sql", "any", "command sql.any(cmp:bit, nl:bit, nr:bit):bit ",
"SQLany_cmp;", "if cmp then true, (nl or nr) nil then nil, else false" ]
[ "sql", "append", "pattern sql.append(mvc:int, sname:str,
tname:str, cname:str, ins:any):int ", "mvc_append_wrap;", "Append to the
column tname.cname (possibly optimized to replace the insert bat of
tname.cname. Returns sequence number for order dependence." ]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "Glue together the calling sequence" ]
[ "sql", "argRecord", "pattern sql.argRecord(a:any...):str ",
"SQLargRecord;", "Glue together the calling sequence" ]
@@ -16155,6 +16166,7 @@ stdout of test 'MAL-signatures` in direc
[ "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", "null", "command sql.null(b:bat[:any_1]):bit ", "SQLnil;",
"if b has a nil return true, else false" ]
[ "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" ]
@@ -16267,6 +16279,8 @@ stdout of test 'MAL-signatures` in direc
[ "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", "window_bound", "pattern sql.window_bound(p:bit, b:any_1,
unit:int, bound:int, excl:int, start:hge):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" ]
+[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1],
err:bit):any_1 ", "zero_or_one_error;", "if col contains exactly one
value return this. Incase of more raise an exception if err is true else return
nil" ]
+[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1],
err:bat[:bit]):any_1 ", "zero_or_one_error_bat;", "if col contains
exactly one value return this. Incase of more raise an exception if err is true
else return nil" ]
[ "sqlcatalog", "alter_add_range_partition", "pattern
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str,
ptnme:str, min:any_1, max:any_1, nills:int, update:int):void ",
"SQLalter_add_range_partition;", "Catalog operation
alter_add_range_partition" ]
[ "sqlcatalog", "alter_add_table", "pattern
sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str,
action:int):void ", "SQLalter_add_table;", "Catalog operation
alter_add_table" ]
[ "sqlcatalog", "alter_add_value_partition", "pattern
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str,
ptnme:str, nills:int, update:int):void ",
"SQLalter_add_value_partition;", "Catalog operation
alter_add_value_partition" ]
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
@@ -113,7 +113,7 @@ BAT *BATconvert(BAT *b, BAT *s, int tp,
BUN BATcount_no_nil(BAT *b);
gdk_return BATdel(BAT *b, BAT *d) __attribute__((__warn_unused_result__));
BAT *BATdense(oid hseq, oid tseq, BUN cnt)
__attribute__((__warn_unused_result__));
-BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches, BUN estimate);
+BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches, bool not_in,
BUN estimate);
gdk_return BATextend(BAT *b, BUN newcap)
__attribute__((__warn_unused_result__));
void BATfakeCommit(BAT *b);
gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps,
BUN n, bool asc, bool nilslast, bool distinct)
__attribute__((__warn_unused_result__));
@@ -146,8 +146,10 @@ gdk_return BATkey(BAT *b, bool onoff);
bool BATkeyed(BAT *b);
gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
bool nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
void *BATmax(BAT *b, void *aggr);
+void *BATmax_skipnil(BAT *b, void *aggr, bit skipnil);
BAT *BATmergecand(BAT *a, BAT *b);
void *BATmin(BAT *b, void *aggr);
+void *BATmin_skipnil(BAT *b, void *aggr, bit skipnil);
gdk_return BATmode(BAT *b, bool transient);
void BATmsync(BAT *b);
bool BATordered(BAT *b);
@@ -702,7 +704,7 @@ str ALGcount_bat(lng *result, const bat
str ALGcount_nil(lng *result, const bat *bid, const bit *ignore_nils);
str ALGcount_no_nil(lng *result, const bat *bid);
str ALGcrossproduct2(bat *l, bat *r, const bat *lid, const bat *rid);
-str ALGdifference(bat *r1, const bat *lid, const bat *rid, const bat *slid,
const bat *srid, const bit *nil_matches, const lng *estimate);
+str ALGdifference(bat *r1, const bat *lid, const bat *rid, const bat *slid,
const bat *srid, const bit *nil_matches, const bit *not_in, const lng
*estimate);
str ALGexist(bit *ret, const bat *bid, const void *val);
str ALGfetchoid(ptr ret, const bat *bid, const oid *pos);
str ALGfind(oid *ret, const bat *bid, ptr val);
@@ -712,7 +714,9 @@ str ALGintersect(bat *r1, const bat *lid
str ALGjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, const
bat *sr, const bit *nil_matches, const lng *estimate);
str ALGleftjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl,
const bat *sr, const bit *nil_matches, const lng *estimate);
str ALGmaxany(ptr result, const bat *bid);
+str ALGmaxany_skipnil(ptr result, const bat *bid, const bit *skipnil);
str ALGminany(ptr result, const bat *bid);
+str ALGminany_skipnil(ptr result, const bat *bid, const bit *skipnil);
str ALGouterjoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl,
const bat *sr, const bit *nil_matches, const lng *estimate);
str ALGprojection(bat *result, const bat *lid, const bat *rid);
str ALGprojectionpath(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2719,7 +2719,7 @@ gdk_export gdk_return BATthetajoin(BAT *
gdk_export gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, bool nil_matches, BUN estimate)
__attribute__((__warn_unused_result__));
gdk_export BAT *BATintersect(BAT *l, BAT *r, BAT *sl, BAT *sr, bool
nil_matches, BUN estimate);
-gdk_export BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches,
BUN estimate);
+gdk_export BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, bool nil_matches,
bool not_in, BUN estimate);
gdk_export gdk_return BATjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl,
BAT *sr, bool nil_matches, BUN estimate)
__attribute__((__warn_unused_result__));
gdk_export gdk_return BATbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, const void *c1, const void *c2, bool li, bool hi, BUN estimate)
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2547,10 +2547,16 @@ BATgroupmin(BAT *b, BAT *g, BAT *e, BAT
do_groupmin, "BATgroupmin");
}
+void *
+BATmin(BAT *b, void *aggr)
+{
+ return BATmin_skipnil(b, aggr, 1);
+}
+
/* return pointer to smallest non-nil value in b, or pointer to nil if
* there is no such value (no values at all, or only nil) */
void *
-BATmin(BAT *b, void *aggr)
+BATmin_skipnil(BAT *b, void *aggr, bit skipnil)
{
PROPrec *prop;
const void *res;
@@ -2615,7 +2621,7 @@ BATmin(BAT *b, void *aggr)
} else {
(void) do_groupmin(&pos, b, NULL, 1, 0, 0, 0,
BATcount(b), NULL, NULL, BATcount(b),
- true, false);
+ skipnil, false);
}
if (is_oid_nil(pos)) {
res = ATOMnilptr(b->ttype);
@@ -2647,6 +2653,12 @@ BATgroupmax(BAT *b, BAT *g, BAT *e, BAT
void *
BATmax(BAT *b, void *aggr)
{
+ return BATmax_skipnil(b, aggr, 1);
+}
+
+void *
+BATmax_skipnil(BAT *b, void *aggr, bit skipnil)
+{
PROPrec *prop;
const void *res;
size_t s;
@@ -2674,6 +2686,16 @@ BATmax(BAT *b, void *aggr)
const oid *ords = (const oid *) (pb ?
pb->torderidx->base : b->torderidx->base) + ORDERIDXOFF;
pos = ords[BATcount(b) - 1];
+ /* nils are first, ie !skipnil, check for nils */
+ if (!skipnil) {
+ BUN z = ords[0];
+
+ bi = bat_iterator(b);
+ res = BUNtail(bi, z - b->hseqbase);
+
+ if (ATOMcmp(b->ttype, res,
ATOMnilptr(b->ttype)) == 0)
+ pos = z;
+ }
} else if ((VIEWtparent(b) == 0 ||
BATcount(b) ==
BATcount(BBPdescriptor(VIEWtparent(b)))) &&
BATcheckimprints(b)) {
@@ -2691,7 +2713,7 @@ BATmax(BAT *b, void *aggr)
} else {
(void) do_groupmax(&pos, b, NULL, 1, 0, 0, 0,
BATcount(b), NULL, NULL, BATcount(b),
- true, false);
+ skipnil, false);
}
if (is_oid_nil(pos)) {
res = ATOMnilptr(b->ttype);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -558,7 +558,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
* this */
BAT *d;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list