Changeset: 6de8fa81c9f4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6de8fa81c9f4 Added Files: monetdb5/tests/gdkTests/Tests/between.mal monetdb5/tests/gdkTests/Tests/between.stable.err monetdb5/tests/gdkTests/Tests/between.stable.out Modified Files: gdk/gdk_calc.c monetdb5/modules/mal/batcalc.mal monetdb5/modules/mal/batcalc.mal.sh monetdb5/modules/mal/calc.mal monetdb5/modules/mal/calc.mal.sh monetdb5/tests/gdkTests/Tests/All Branch: default Log Message:
Merge with Jan2014 branch. diffs (truncated from 921 to 300 lines): diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -8434,8 +8434,8 @@ BATcalcbetween_intern(const void *src, i k = start * incr3, l = start; l < end; - i += incr1, j += incr2, k += incr3, l++, - soff+=wd1, loff+= wd2, hoff+= wd3 ) { + i += incr1, j += incr2, k += incr3, l++, + 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); @@ -8623,15 +8623,29 @@ VARcalcbetween(ValPtr ret, const ValReco const ValRecord *hi) { BUN nils = 0; /* to make reusing BETWEEN macro easier */ - - if (ATOMstorage(v->vtype) != ATOMstorage(lo->vtype) || - ATOMstorage(v->vtype) != ATOMstorage(hi->vtype)) { + int t; + int (*atomcmp)(const void *, const void *); + const void *nil; + + t = v->vtype; + if (t != lo->vtype || t != hi->vtype) { GDKerror("VARcalcbetween: incompatible input types.\n"); return GDK_FAIL; } + if (!BATatoms[t].linear) { + GDKerror("VARcalcbetween: non-linear input type.\n"); + return GDK_FAIL; + } + + nil = ATOMnilptr(t); + atomcmp = BATatoms[t].atomCmp; + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == nil && + BATatoms[ATOMstorage(t)].atomCmp == atomcmp) + t = ATOMstorage(t); ret->vtype = TYPE_bit; - switch (ATOMstorage(v->vtype)) { + switch (t) { case TYPE_bte: ret->val.btval = BETWEEN(v->val.btval, lo->val.btval, hi->val.btval, bte); break; @@ -8651,9 +8665,17 @@ VARcalcbetween(ValPtr ret, const ValReco ret->val.btval = BETWEEN(v->val.dval, lo->val.dval, hi->val.dval, dbl); break; default: - GDKerror("VARcalcbetween: bad input type %s.\n", - ATOMname(v->vtype)); - return GDK_FAIL; + if (atomcmp(VALptr(v), nil) == 0 || + (atomcmp(VALptr(lo), nil) == 0 && + atomcmp(VALptr(hi), nil) == 0)) + ret->val.btval = bit_nil; + else + ret->val.btval = + (bit) ((atomcmp(VALptr(lo), nil) == 0 || + atomcmp(VALptr(v), VALptr(lo)) >= 0) && + (atomcmp(VALptr(hi), nil) == 0 || + atomcmp(VALptr(v), VALptr(hi)) <= 0)); + break; } (void) nils; return GDK_SUCCEED; diff --git a/monetdb5/modules/mal/batcalc.mal b/monetdb5/modules/mal/batcalc.mal --- a/monetdb5/modules/mal/batcalc.mal +++ b/monetdb5/modules/mal/batcalc.mal @@ -19671,228 +19671,28 @@ address CMDbatCMP comment "Return -1/0/1 if V </==/> B with candidates list"; -pattern between(b:bat[:oid,:bit],lo:bat[:oid,:bit],hi:bat[:oid,:bit]) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:bat[:oid,:any_1],hi:bat[:oid,:any_1]) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bat[:oid,:bit],hi:bat[:oid,:bit],s:bat[:oid,:oid]) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:bat[:oid,:any_1],hi:bat[:oid,:any_1],s:bat[:oid,:oid]) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bat[:oid,:bit],hi:bit) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:bat[:oid,:any_1],hi:any_1) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bat[:oid,:bit],hi:bit,s:bat[:oid,:oid]) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:bat[:oid,:any_1],hi:any_1,s:bat[:oid,:oid]) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bit,hi:bat[:oid,:bit]) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:any_1,hi:bat[:oid,:any_1]) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bit,hi:bat[:oid,:bit],s:bat[:oid,:oid]) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:any_1,hi:bat[:oid,:any_1],s:bat[:oid,:oid]) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bit,hi:bit) :bat[:oid,:bit] +pattern between(b:bat[:oid,:any_1],lo:any_1,hi:any_1) :bat[:oid,:bit] address CMDbatBETWEEN comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bit],lo:bit,hi:bit,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:bte],lo:bat[:oid,:bte],hi:bat[:oid,:bte]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bat[:oid,:bte],hi:bat[:oid,:bte],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bat[:oid,:bte],hi:bte) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bat[:oid,:bte],hi:bte,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bte,hi:bat[:oid,:bte]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bte,hi:bat[:oid,:bte],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bte,hi:bte) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:bte],lo:bte,hi:bte,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:sht],lo:bat[:oid,:sht],hi:bat[:oid,:sht]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:bat[:oid,:sht],hi:bat[:oid,:sht],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:bat[:oid,:sht],hi:sht) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:bat[:oid,:sht],hi:sht,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:sht,hi:bat[:oid,:sht]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:sht,hi:bat[:oid,:sht],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:sht,hi:sht) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:sht],lo:sht,hi:sht,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:int],lo:bat[:oid,:int],hi:bat[:oid,:int]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:bat[:oid,:int],hi:bat[:oid,:int],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:bat[:oid,:int],hi:int) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:bat[:oid,:int],hi:int,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:int,hi:bat[:oid,:int]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:int,hi:bat[:oid,:int],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:int,hi:int) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:int],lo:int,hi:int,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:wrd],lo:bat[:oid,:wrd],hi:bat[:oid,:wrd]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:bat[:oid,:wrd],hi:bat[:oid,:wrd],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:bat[:oid,:wrd],hi:wrd) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:bat[:oid,:wrd],hi:wrd,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:wrd,hi:bat[:oid,:wrd]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:wrd,hi:bat[:oid,:wrd],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:wrd,hi:wrd) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:wrd],lo:wrd,hi:wrd,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:lng],lo:bat[:oid,:lng],hi:bat[:oid,:lng]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:bat[:oid,:lng],hi:bat[:oid,:lng],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:bat[:oid,:lng],hi:lng) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:bat[:oid,:lng],hi:lng,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:lng,hi:bat[:oid,:lng]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:lng,hi:bat[:oid,:lng],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:lng,hi:lng) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:lng],lo:lng,hi:lng,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:flt],lo:bat[:oid,:flt],hi:bat[:oid,:flt]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:bat[:oid,:flt],hi:bat[:oid,:flt],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:bat[:oid,:flt],hi:flt) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:bat[:oid,:flt],hi:flt,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:flt,hi:bat[:oid,:flt]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:flt,hi:bat[:oid,:flt],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:flt,hi:flt) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:flt],lo:flt,hi:flt,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:dbl],lo:bat[:oid,:dbl],hi:bat[:oid,:dbl]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:bat[:oid,:dbl],hi:bat[:oid,:dbl],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:bat[:oid,:dbl],hi:dbl) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:bat[:oid,:dbl],hi:dbl,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:dbl,hi:bat[:oid,:dbl]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:dbl,hi:bat[:oid,:dbl],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:dbl,hi:dbl) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:dbl],lo:dbl,hi:dbl,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; - -pattern between(b:bat[:oid,:oid],lo:bat[:oid,:oid],hi:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:oid],lo:bat[:oid,:oid],hi:bat[:oid,:oid],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:oid],lo:bat[:oid,:oid],hi:oid) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:oid],lo:bat[:oid,:oid],hi:oid,s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive with candidates list, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:oid],lo:oid,hi:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN -comment "B between LO and HI inclusive, nil border is (minus) infinity"; -pattern between(b:bat[:oid,:oid],lo:oid,hi:bat[:oid,:oid],s:bat[:oid,:oid]) :bat[:oid,:bit] -address CMDbatBETWEEN _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list