Changeset: 7f0b724a589b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7f0b724a589b
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        gdk/gdk_calc.c
        gdk/gdk_calc.h
        monetdb5/modules/mal/00_batcalc_hge.mal.sh
        monetdb5/modules/mal/00_calc_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/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        sql/backends/monet5/sql_statement.c
Branch: default
Log Message:

Implemented low/high inclusive flags in (bat)calc.between.
Also removed separate (bat)calc.between_symmetric: always specify all
flags in the (bat)calc.between call.


diffs (truncated from 851 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
@@ -6108,22 +6108,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], 
lo:any_1, hi:any_1):bat[:bit] ",        "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:any_1, s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEEN;",       "B 
between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:bat[:any_1]):bat[:bit] ",  "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:bat[:any_1], s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEEN;",       
"B between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:any_1):bat[:bit] ",  "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:any_1, s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEEN;",       
"B between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:bat[:any_1]):bat[:bit] ",    "CMDbatBETWEEN;",       "B 
between LO and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:bat[:any_1], s:bat[:oid]):bat[:bit] ",       
"CMDbatBETWEEN;",       "B between LO and HI inclusive with candidates list"    
]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:any_1):bat[:bit] ",      
"CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) inclusive" 
]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:any_1, 
s:bat[:oid]):bat[:bit] ", "CMDbatBETWEENsymmetric;",      "B between V1 and V2 
(or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:bat[:any_1]):bat[:bit] ", 
       "CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) 
inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:bat[:any_1], 
s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:any_1):bat[:bit] ", 
       "CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) 
inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:any_1, 
s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], 
v2:bat[:any_1]):bat[:bit] ",  "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], 
s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive 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):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):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):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):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):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):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):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):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"        ]
@@ -10062,8 +10054,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):bit ",       "CMDvarBETWEEN;",       "B between LO and HI inclusive" ]
-[ "calc",      "between_symmetric",    "pattern 
calc.between_symmetric(b:any_1, v1:any_1, v2:any_1):bit ",     
"CMDvarBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) inclusive" 
]
+[ "calc",      "between",      "pattern calc.between(b:any_1, lo:any_1, 
hi:any_1, sym:bit, linc:bit, hinc: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
@@ -8642,14 +8642,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], 
lo:any_1, hi:any_1):bat[:bit] ",        "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:any_1, s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEEN;",       "B 
between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:bat[:any_1]):bat[:bit] ",  "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:any_1, hi:bat[:any_1], s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEEN;",       
"B between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:any_1):bat[:bit] ",  "CMDbatBETWEEN;",       "B between LO 
and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:any_1, s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEEN;",       
"B between LO and HI inclusive with candidates list"    ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:bat[:any_1]):bat[:bit] ",    "CMDbatBETWEEN;",       "B 
between LO and HI inclusive" ]
-[ "batcalc",   "between",      "pattern batcalc.between(b:bat[:any_1], 
lo:bat[:any_1], hi:bat[:any_1], s:bat[:oid]):bat[:bit] ",       
"CMDbatBETWEEN;",       "B between LO and HI inclusive 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):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):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):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):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):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):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):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):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" ]
@@ -8658,14 +8658,6 @@ stdout of test 'MAL-signatures` in direc
 [ "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_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:any_1):bat[:bit] ",      
"CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) inclusive" 
]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:any_1, 
s:bat[:oid]):bat[:bit] ", "CMDbatBETWEENsymmetric;",      "B between V1 and V2 
(or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:bat[:any_1]):bat[:bit] ", 
       "CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) 
inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:any_1, v2:bat[:any_1], 
s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:any_1):bat[:bit] ", 
       "CMDbatBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) 
inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:any_1, 
s:bat[:oid]):bat[:bit] ",   "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive with candidates list"    ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], 
v2:bat[:any_1]):bat[:bit] ",  "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive" ]
-[ "batcalc",   "between_symmetric",    "pattern 
batcalc.between_symmetric(b:bat[:any_1], v1:bat[:any_1], v2:bat[:any_1], 
s:bat[:oid]):bat[:bit] ",     "CMDbatBETWEENsymmetric;",      "B between V1 and 
V2 (or vice versa) inclusive with candidates list"    ]
 [ "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"        ]
@@ -14214,8 +14206,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):bit ",       "CMDvarBETWEEN;",       "B between LO and HI inclusive" ]
-[ "calc",      "between_symmetric",    "pattern 
calc.between_symmetric(b:any_1, v1:any_1, v2:any_1):bit ",     
"CMDvarBETWEENsymmetric;",      "B between V1 and V2 (or vice versa) inclusive" 
]
+[ "calc",      "between",      "pattern calc.between(b:any_1, lo:any_1, 
hi:any_1, sym:bit, linc:bit, hinc: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 sym);
-BAT *BATcalcbetweenbatcst(BAT *b, BAT *lo, const ValRecord *hi, BAT *s, bool 
sym);
-BAT *BATcalcbetweencstbat(BAT *b, const ValRecord *lo, BAT *hi, BAT *s, bool 
sym);
-BAT *BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, 
BAT *s, bool sym);
+BAT *BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool symmetric, bool 
linc, bool hinc);
+BAT *BATcalcbetweenbatcst(BAT *b, BAT *lo, const ValRecord *hi, BAT *s, bool 
symmetric, bool linc, bool hinc);
+BAT *BATcalcbetweencstbat(BAT *b, const ValRecord *lo, BAT *hi, BAT *s, bool 
symmetric, bool linc, bool hinc);
+BAT *BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, 
BAT *s, bool symmetric, bool linc, bool hinc);
 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);
@@ -354,7 +354,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 sym);
+gdk_return VARcalcbetween(ValPtr ret, const ValRecord *v, const ValRecord *lo, 
const ValRecord *hi, bool symmetric, bool linc, bool hinc);
 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);
@@ -940,7 +940,6 @@ str CMDbatADDenlarge(Client cntxt, MalBl
 str CMDbatADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDbatAND(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDbatBETWEEN(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-str CMDbatBETWEENsymmetric(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str CMDbatCMP(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDbatDECR(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDbatDIV(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
@@ -1157,7 +1156,6 @@ str CMDvarADDstr(str *ret, str *s1, str 
 str CMDvarADDstrint(str *ret, str *s1, int *i);
 str CMDvarAND(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDvarBETWEEN(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
-str CMDvarBETWEENsymmetric(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str CMDvarCMP(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDvarCONVERT(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDvarCONVERTptr(ptr *ret, ptr *v);
@@ -2058,7 +2056,6 @@ str batstrRef;
 str batxmlRef;
 str bbpRef;
 str betweenRef;
-str betweensymmetricRef;
 str bindRef;
 str binddbatRef;
 str bindidxRef;
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -12760,8 +12760,11 @@ VARcalcrsh(ValPtr ret, const ValRecord *
 #define BETWEEN(v, lo, hi, TYPE)                                       \
        (is_##TYPE##_nil(v) || is_##TYPE##_nil(lo) || is_##TYPE##_nil(hi) ? \
         (nils++, bit_nil) :                                            \
-        (bit) (((v) >= (lo) && (v) <= (hi)) ||                         \
-               (sym && (v) >= (hi) && (v) <= (lo))))
+        (bit) ((((lo) < (v) || (linc && (lo) == (v))) &&               \
+                ((v) < (hi) || (hinc && (v) == (hi)))) ||              \
+               (symmetric &&                                                   
\
+                ((hi) < (v) || (hinc && (hi) == (v))) &&               \
+                ((v) < (lo) || (linc && (v) == (lo))))))
 
 #define BETWEEN_LOOP_TYPE(TYPE)                                                
\
        do {                                                            \
@@ -12783,9 +12786,10 @@ static BAT *
 BATcalcbetween_intern(const void *src, int incr1, const char *hp1, int wd1,
                      const void *lo, int incr2, const char *hp2, int wd2,
                      const void *hi, int incr3, const char *hp3, int wd3,
-                     int tp, BUN cnt, BUN start, BUN end, const oid *restrict 
cand,
-                     const oid *candend, oid seqbase, bool sym,
-                     const char *func)
+                     int tp, BUN cnt, BUN start, BUN end,
+                     const oid *restrict cand, const oid *candend,
+                     oid seqbase, bool symmetric,
+                     bool linc, bool hinc, const char *func)
 {
        BAT *bn;
        BUN nils = 0;
@@ -12847,9 +12851,15 @@ BATcalcbetween_intern(const void *src, i
                             soff += wd1, loff += wd2, hoff += wd3) {
                        const void *p1, *p2, *p3;
                        CHECKCAND(dst, l, seqbase, bit_nil);
-                       p1 = hp1 ? (const void *) (hp1 + VarHeapVal(src, i, 
wd1)) : (const void *) ((const char *) src + soff);
-                       p2 = hp2 ? (const void *) (hp2 + VarHeapVal(lo, j, 
wd2)) : (const void *) ((const char *) lo + loff);
-                       p3 = hp3 ? (const void *) (hp3 + VarHeapVal(hi, k, 
wd3)) : (const void *) ((const char *) hi + hoff);
+                       p1 = hp1
+                               ? (const void *) (hp1 + VarHeapVal(src, i, wd1))
+                               : (const void *) ((const char *) src + soff);
+                       p2 = hp2
+                               ? (const void *) (hp2 + VarHeapVal(lo, j, wd2))
+                               : (const void *) ((const char *) lo + loff);
+                       p3 = hp3
+                               ? (const void *) (hp3 + VarHeapVal(hi, k, wd3))
+                               : (const void *) ((const char *) hi + hoff);
                        if (p1 == NULL || p2 == NULL || p3 == NULL ||
                            (*atomcmp)(p1, nil) == 0 ||
                            (*atomcmp)(p2, nil) == 0 ||
@@ -12857,11 +12867,17 @@ BATcalcbetween_intern(const void *src, i
                                nils++;
                                dst[l] = bit_nil;
                        } else {
-                               dst[l] = (bit) (((*atomcmp)(p1, p2) >= 0 &&
-                                                (*atomcmp)(p1, p3) <= 0) ||
-                                               (sym &&
-                                                (*atomcmp)(p1, p3) >= 0 &&
-                                                (*atomcmp)(p1, p2) <= 0));
+                               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))));
                        }
                }
                break;
@@ -12881,7 +12897,8 @@ BATcalcbetween_intern(const void *src, i
 }
 
 BAT *
-BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool sym)
+BATcalcbetween(BAT *b, BAT *lo, BAT *hi, BAT *s, bool symmetric,
+              bool linc, bool hinc)
 {
        BAT *bn;
        BUN start, end, cnt;
@@ -12898,23 +12915,27 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi,
 
        CANDINIT(b, s, start, end, cnt, cand, candend);
 
-       if (b->ttype == TYPE_void &&
-           lo->ttype == TYPE_void &&
-           hi->ttype == TYPE_void) {
+       if (BATtvoid(b) &&
+           BATtvoid(lo) &&
+           BATtvoid(hi)) {
                bit res;
 
-               if (is_oid_nil(b->tseqbase) ||
-                   is_oid_nil(lo->tseqbase) ||
-                   is_oid_nil(hi->tseqbase))
+               if (!BATtdense(b) || !BATtdense(lo) || !BATtdense(hi))
                        res = bit_nil;
                else
-                       res = (bit) ((b->tseqbase >= lo->tseqbase &&
-                                     b->tseqbase <= hi->tseqbase) ||
-                                    (sym &&
-                                     b->tseqbase >= hi->tseqbase &&
-                                     b->tseqbase <= lo->tseqbase));
-
-               return BATconstant(b->hseqbase, TYPE_bit, &res, BATcount(b), 
TRANSIENT);
+                       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))));
+
+               return BATconstant(b->hseqbase, TYPE_bit, &res, BATcount(b),
+                                  TRANSIENT);
        }
 
        bn = BATcalcbetween_intern(Tloc(b, 0), 1,
@@ -12928,13 +12949,15 @@ BATcalcbetween(BAT *b, BAT *lo, BAT *hi,
                                   hi->twidth,
                                   b->ttype, cnt,
                                   start, end, cand, candend,
-                                  b->hseqbase, sym, "BATcalcbetween");
+                                  b->hseqbase, symmetric, linc, hinc,
+                                  "BATcalcbetween");
 
        return bn;
 }
 
 BAT *
-BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, BAT *s, 
bool sym)
+BATcalcbetweencstcst(BAT *b, const ValRecord *lo, const ValRecord *hi, BAT *s,
+                    bool symmetric, bool linc, bool hinc)
 {
        BAT *bn;
        BUN start, end, cnt;
@@ -12957,13 +12980,15 @@ BATcalcbetweencstcst(BAT *b, const ValRe
                                   VALptr(hi), 0, NULL, 0,
                                   b->ttype, cnt,
                                   start, end, cand, candend,
-                                  b->hseqbase, sym, "BATcalcbetweencstcst");
+                                  b->hseqbase, symmetric,
+                                  linc, hinc, "BATcalcbetweencstcst");
 
        return bn;
 }
 
 BAT *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to