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

Reply via email to