Changeset: f806507d3511 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f806507d3511 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out gdk/ChangeLog.Nov2019 gdk/gdk_calc.c gdk/gdk_calc.h monetdb5/mal/Tests/tst670.stable.err monetdb5/mal/mal_debugger.c monetdb5/modules/kernel/algebra.c monetdb5/modules/mal/00_batcalc_hge.mal monetdb5/modules/mal/00_batcalc_hge.mal.sh monetdb5/modules/mal/01_batcalc.mal monetdb5/modules/mal/01_batcalc.mal.sh monetdb5/modules/mal/01_calc.mal monetdb5/modules/mal/01_calc.mal.sh monetdb5/modules/mal/batcalc.c monetdb5/modules/mal/calc.c monetdb5/modules/mal/clients.c monetdb5/modules/mal/mal_io.c monetdb5/modules/mal/mal_mapi.c monetdb5/modules/mal/mat.c monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/projectionpath.c monetdb5/modules/mal/querylog.c monetdb5/modules/mal/remote.c monetdb5/modules/mal/sysmon.c monetdb5/modules/mal/wlc.c monetdb5/optimizer/opt_wlc.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_statement.c sql/backends/monet5/wlr.c sql/common/sql_types.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out sql/test/BugTracker-2017/Tests/sqlitelogictest-comparisons-between-floating-points-and-NULL.Bug-6496.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-algebra-rangejoin-undefined.Bug-6610.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-wrong-select-not-between.Bug-6511.stable.out sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out 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.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.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/subquery/Tests/correlated.stable.err 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.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.int128 sql/test/wlcr/Tests/All sql/test/wlcr/Tests/wlc01.py sql/test/wlcr/Tests/wlc01.stable.out sql/test/wlcr/Tests/wlc100.py sql/test/wlcr/Tests/wlc100.stable.out sql/test/wlcr/Tests/wlc20.py sql/test/wlcr/Tests/wlc20.stable.out sql/test/wlcr/Tests/wlc21.py sql/test/wlcr/Tests/wlc21.stable.out sql/test/wlcr/Tests/wlc30.py sql/test/wlcr/Tests/wlc30.stable.out sql/test/wlcr/Tests/wlc40.py sql/test/wlcr/Tests/wlc40.stable.out sql/test/wlcr/Tests/wlc50.py sql/test/wlcr/Tests/wlc50.stable.out sql/test/wlcr/Tests/wlc70.py sql/test/wlcr/Tests/wlc70.stable.out testing/Mtest.py.in Branch: candidate-exceptions Log Message:
Merge with default branch. diffs (truncated from 144863 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 @@ -6117,14 +6117,14 @@ stdout of test 'MAL-signatures` in direc [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], s:bat[:oid], scale:int):dbl ", "CMDcalcavg;", "average of non-nil values of B" ] [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], scale:int) (X_0:dbl, X_1:lng) ", "CMDcalcavg;", "average and number of non-nil values of B" ] [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], scale:int):dbl ", "CMDcalcavg;", "average of non-nil values of B with candidates list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bit]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bit to bit, signal error on overflow" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bit], s:bat[:oid]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bit to bit with candidates list, signal error on overflow" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bte]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bte to bit, signal error on overflow" ] @@ -10066,7 +10066,7 @@ stdout of test 'MAL-signatures` in direc [ "calc", "and", "pattern calc.and(v1:int, v2:int):int ", "CMDvarAND;", "Return V1 AND V2" ] [ "calc", "and", "pattern calc.and(v1:lng, v2:lng):lng ", "CMDvarAND;", "Return V1 AND V2" ] [ "calc", "and", "pattern calc.and(v1:sht, v2:sht):sht ", "CMDvarAND;", "Return V1 AND V2" ] -[ "calc", "between", "pattern calc.between(b:any_1, lo:any_1, hi:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bit ", "CMDvarBETWEEN;", "B between LO and HI inclusive" ] +[ "calc", "between", "pattern calc.between(b:any_1, lo:any_1, hi:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bit ", "CMDvarBETWEEN;", "B between LO and HI inclusive" ] [ "calc", "bit", "pattern calc.bit(v:bit):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] [ "calc", "bit", "pattern calc.bit(v:bte):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] [ "calc", "bit", "pattern calc.bit(v:dbl):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] 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 @@ -8651,22 +8651,14 @@ stdout of test 'MAL-signatures` in direc [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], s:bat[:oid], scale:int):dbl ", "CMDcalcavg;", "average of non-nil values of B" ] [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], scale:int) (X_0:dbl, X_1:lng) ", "CMDcalcavg;", "average and number of non-nil values of B" ] [ "batcalc", "avg", "pattern batcalc.avg(b:bat[:sht], scale:int):dbl ", "CMDcalcavg;", "average of non-nil values of B with candidates list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:bat[:hge], hi:bat[:hge]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:bat[:hge], hi:bat[:hge], s:bat[:oid]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive with candidates list, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:bat[:hge], hi:hge):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:bat[:hge], hi:hge, s:bat[:oid]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive with candidates list, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:hge, hi:bat[:hge]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:hge, hi:bat[:hge], s:bat[:oid]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive with candidates list, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:hge, hi:hge):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive, nil border is (minus) infinity" ] -[ "batcalc", "between", "pattern batcalc.between(b:bat[:hge], lo:hge, hi:hge, s:bat[:oid]):bat[:bit] ", "CMDbatBETWEEN;", "B between LO and HI inclusive with candidates list, nil border is (minus) infinity" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:any_1, v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], s:bat[:oid], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa) with candidate list" ] +[ "batcalc", "between", "pattern batcalc.between(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bat[:bit] ", "CMDbatBETWEEN;", "B between V1 and V2 (or vice versa)" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bit]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bit to bit, signal error on overflow" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bit], s:bat[:oid]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bit to bit with candidates list, signal error on overflow" ] [ "batcalc", "bit", "pattern batcalc.bit(b:bat[:bte]):bat[:bit] ", "CMDconvertsignal_bit;", "cast from bte to bit, signal error on overflow" ] @@ -14218,7 +14210,7 @@ stdout of test 'MAL-signatures` in direc [ "calc", "and", "pattern calc.and(v1:int, v2:int):int ", "CMDvarAND;", "Return V1 AND V2" ] [ "calc", "and", "pattern calc.and(v1:lng, v2:lng):lng ", "CMDvarAND;", "Return V1 AND V2" ] [ "calc", "and", "pattern calc.and(v1:sht, v2:sht):sht ", "CMDvarAND;", "Return V1 AND V2" ] -[ "calc", "between", "pattern calc.between(b:any_1, lo:any_1, hi:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit):bit ", "CMDvarBETWEEN;", "B between LO and HI inclusive" ] +[ "calc", "between", "pattern calc.between(b:any_1, lo:any_1, hi:any_1, sym:bit, linc:bit, hinc:bit, nils_false:bit, anti:bit):bit ", "CMDvarBETWEEN;", "B between LO and HI inclusive" ] [ "calc", "bit", "pattern calc.bit(v:bit):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] [ "calc", "bit", "pattern calc.bit(v:bte):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] [ "calc", "bit", "pattern calc.bit(v:dbl):bit ", "CMDvarCONVERT;", "Cast VALUE to bit" ] 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 @@ -27,10 +27,10 @@ BAT *BATcalcaddcst(BAT *b, const ValReco BAT *BATcalcand(BAT *b1, BAT *b2, BAT *s); BAT *BATcalcandcst(BAT *b, const ValRecord *v, BAT *s); gdk_return BATcalcavg(BAT *b, BAT *s, dbl *avg, BUN *vals, int scale); -BAT *BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false); -BAT *BATcalcbetweenbatcst(BAT *b, BAT *lo, const ValRecord *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false); -BAT *BATcalcbetweencstbat(BAT *b, const ValRecord *lo, BAT *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false); -BAT *BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false); +BAT *BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false, bool anti); +BAT *BATcalcbetweenbatcst(BAT *b, BAT *lo, const ValRecord *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false, bool anti); +BAT *BATcalcbetweencstbat(BAT *b, const ValRecord *lo, BAT *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false, bool anti); +BAT *BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, BAT *s, bool symmetric, bool linc, bool hinc, bool nils_false, bool anti); BAT *BATcalccmp(BAT *b1, BAT *b2, BAT *s); BAT *BATcalccmpcst(BAT *b, const ValRecord *v, BAT *s); BAT *BATcalccstadd(const ValRecord *v, BAT *b, BAT *s, int tp, bool abort_on_error); @@ -359,7 +359,7 @@ ValPtr VALset(ValPtr v, int t, void *p); gdk_return VARcalcabsolute(ValPtr ret, const ValRecord *v); gdk_return VARcalcadd(ValPtr ret, const ValRecord *lft, const ValRecord *rgt, bool abort_on_error); gdk_return VARcalcand(ValPtr ret, const ValRecord *lft, const ValRecord *rgt); -gdk_return VARcalcbetween(ValPtr ret, const ValRecord *v, const ValRecord *lo, const ValRecord *hi, bool symmetric, bool linc, bool hinc, bool nils_false); +gdk_return VARcalcbetween(ValPtr ret, const ValRecord *v, const ValRecord *lo, const ValRecord *hi, bool symmetric, bool linc, bool hinc, bool nils_false, bool anti); gdk_return VARcalccmp(ValPtr ret, const ValRecord *lft, const ValRecord *rgt); gdk_return VARcalcdecr(ValPtr ret, const ValRecord *v, bool abort_on_error); gdk_return VARcalcdiv(ValPtr ret, const ValRecord *lft, const ValRecord *rgt, bool abort_on_error); diff --git a/gdk/ChangeLog.Nov2019 b/gdk/ChangeLog.Nov2019 --- a/gdk/ChangeLog.Nov2019 +++ b/gdk/ChangeLog.Nov2019 @@ -1,6 +1,10 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Sun Sep 8 2019 Sjoerd Mullender <sjo...@acm.org> +- BATcalcbetween and all its variants now have an extra bool parameter + "anti" to invert the test. + * Thu Apr 18 2019 Sjoerd Mullender <sjo...@acm.org> - All forms of BATcalcbetween and VARcalcbetween have extra bool arguments for low inclusive, high inclusive and nils false. The latter causes diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -12274,16 +12274,46 @@ VARcalcrsh(ValPtr ret, const ValRecord * /* ---------------------------------------------------------------------- */ /* between (any "linear" type) */ +#define LTbte(a,b) ((a) < (b)) +#define LTsht(a,b) ((a) < (b)) +#define LTint(a,b) ((a) < (b)) +#define LTlng(a,b) ((a) < (b)) +#define LThge(a,b) ((a) < (b)) +#define LTflt(a,b) ((a) < (b)) +#define LTdbl(a,b) ((a) < (b)) +#define LTany(a,b) ((*atomcmp)(a, b) < 0) +#define EQbte(a,b) ((a) == (b)) +#define EQsht(a,b) ((a) == (b)) +#define EQint(a,b) ((a) == (b)) +#define EQlng(a,b) ((a) == (b)) +#define EQhge(a,b) ((a) == (b)) +#define EQflt(a,b) ((a) == (b)) +#define EQdbl(a,b) ((a) == (b)) +#define EQany(a,b) ((*atomcmp)(a, b) == 0) + +#define is_any_nil(v) ((v) == NULL || (*atomcmp)((v), nil) == 0) + +#define less3(a,b,i,t) (is_##t##_nil(a) || is_##t##_nil(b) ? bit_nil : LT##t(a, b) || (i && EQ##t(a, b))) +#define grtr3(a,b,i,t) (is_##t##_nil(a) || is_##t##_nil(b) ? bit_nil : LT##t(b, a) || (i && EQ##t(a, b))) +#define and3(a,b) (is_bit_nil(a) ? is_bit_nil(b) || (b) ? bit_nil : 0 : is_bit_nil(b) ? (a) ? bit_nil : 0 : (a) && (b)) +#define or3(a,b) (is_bit_nil(a) ? (is_bit_nil(b) || !(b) ? bit_nil : 1) : ((a) ? 1 : (is_bit_nil(b) ? bit_nil : (b)))) +#define not3(a) (is_bit_nil(a) ? bit_nil : !(a)) + +#define between3(v, lo, linc, hi, hinc, TYPE) \ + and3(grtr3(v, lo, linc, TYPE), less3(v, hi, hinc, TYPE)) + #define BETWEEN(v, lo, hi, TYPE) \ (is_##TYPE##_nil(v) \ - ? nils_false ? 0 : (nils++, bit_nil) \ - : (is_##TYPE##_nil(lo) || is_##TYPE##_nil(hi) \ - ? (nils++, bit_nil) \ - : (bit) ((((lo) < (v) || (linc && (lo) == (v))) && \ - ((v) < (hi) || (hinc && (v) == (hi)))) || \ - (symmetric && \ - ((hi) < (v) || (hinc && (hi) == (v))) && \ - ((v) < (lo) || (linc && (v) == (lo))))))) + ? nils_false ? 0 : bit_nil \ + : (bit) (anti \ + ? (symmetric \ + ? not3(or3(between3(v, lo, linc, hi, hinc, TYPE), \ + between3(v, hi, hinc, lo, linc, TYPE))) \ + : not3(between3(v, lo, linc, hi, hinc, TYPE))) \ + : (symmetric \ + ? or3(between3(v, lo, linc, hi, hinc, TYPE), \ + between3(v, hi, hinc, lo, linc, TYPE)) \ + : between3(v, lo, linc, hi, hinc, TYPE)))) #define BETWEEN_LOOP_TYPE(TYPE) \ do { \ @@ -12299,6 +12329,7 @@ VARcalcrsh(ValPtr ret, const ValRecord * ((const TYPE *) lo)[j], \ ((const TYPE *) hi)[k], \ TYPE); \ + nils += is_bit_nil(dst[l]); \ l++; \ x = canditer_next(ci); \ if (is_oid_nil(x)) \ @@ -12316,7 +12347,7 @@ BATcalcbetween_intern(const void *src, i const void *lo, int incr2, const char *hp2, int wd2, const void *hi, int incr3, const char *hp3, int wd3, int tp, BUN cnt, struct canditer *restrict ci, - oid seqbase, bool symmetric, + oid seqbase, bool symmetric, bool anti, bool linc, bool hinc, bool nils_false, const char *func) { BAT *bn; @@ -12387,33 +12418,8 @@ BATcalcbetween_intern(const void *src, i p3 = hp3 ? (const void *) (hp3 + VarHeapVal(hi, k, wd3)) : (const void *) ((const char *) hi + k * wd3); - if (p1 == NULL || p2 == NULL || p3 == NULL) { - nils++; - dst[l] = bit_nil; - } else if ((*atomcmp)(p1, nil) == 0) { - if (nils_false) - dst[l] = 0; - else { - nils++; - dst[l] = bit_nil; - } - } else if ((*atomcmp)(p2, nil) == 0 || - (*atomcmp)(p3, nil) == 0) { - nils++; - dst[l] = bit_nil; - } else { - int c; - dst[l] = (bit) - ((((c = (*atomcmp)(p1, p2)) > 0 - || (linc && c == 0)) - && ((c = (*atomcmp)(p1, p3)) < 0 - || (hinc && c == 0))) - || (symmetric - && ((c = (*atomcmp)(p1, p3)) > 0 - || (hinc && c == 0)) - && ((c = (*atomcmp)(p1, p2)) < 0 - || (linc && c == 0)))); - } + dst[l] = BETWEEN(p1, p2, p3, any); + nils += is_bit_nil(dst[l]); l++; x = canditer_next(ci); if (is_oid_nil(x)) @@ -12440,7 +12446,7 @@ BATcalcbetween_intern(const void *src, i BAT * BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool symmetric, - bool linc, bool hinc, bool nils_false) + bool linc, bool hinc, bool nils_false, bool anti) { BAT *bn; BUN cnt, ncand; @@ -12473,15 +12479,16 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi, res = bit_nil; else res = (bit) - (((b->tseqbase > lo->tseqbase || - (linc && b->tseqbase == lo->tseqbase)) && - (b->tseqbase < hi->tseqbase || - (hinc && b->tseqbase == hi->tseqbase))) || - (symmetric && - (b->tseqbase > hi->tseqbase || - (hinc && b->tseqbase == hi->tseqbase)) && - (b->tseqbase < lo->tseqbase || - (linc && b->tseqbase == lo->tseqbase)))); + ((((b->tseqbase > lo->tseqbase || + (linc && b->tseqbase == lo->tseqbase)) && + (b->tseqbase < hi->tseqbase || + (hinc && b->tseqbase == hi->tseqbase))) || + (symmetric && + (b->tseqbase > hi->tseqbase || + (hinc && b->tseqbase == hi->tseqbase)) && + (b->tseqbase < lo->tseqbase || + (linc && b->tseqbase == lo->tseqbase)))) + ^ anti); return BATconstant(b->hseqbase, TYPE_bit, &res, BATcount(b), TRANSIENT); @@ -12498,7 +12505,7 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi, hi->twidth, b->ttype, cnt, &ci, - b->hseqbase, symmetric, linc, hinc, + b->hseqbase, symmetric, anti, linc, hinc, nils_false, __func__); return bn; @@ -12506,7 +12513,8 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT * BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, BAT *s, - bool symmetric, bool linc, bool hinc, bool nils_false) + bool symmetric, bool linc, bool hinc, bool nils_false, + bool anti) { BAT *bn; BUN cnt, ncand; @@ -12533,7 +12541,7 @@ BATcalcbetweencstcst(BAT *b, const ValRe VALptr(hi), 0, NULL, 0, b->ttype, cnt, &ci, - b->hseqbase, symmetric, + b->hseqbase, symmetric, anti, linc, hinc, nils_false, __func__); @@ -12542,7 +12550,8 @@ BATcalcbetweencstcst(BAT *b, const ValRe BAT * BATcalcbetweenbatcst(BAT *b, BAT *lo, const ValRecord *hi, BAT *s, - bool symmetric, bool linc, bool hinc, bool nils_false) + bool symmetric, bool linc, bool hinc, bool nils_false, + bool anti) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list