Changeset: 0a8f4828a2bb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a8f4828a2bb
Modified Files:
gdk/gdk_calc.c
Branch: Jan2014
Log Message:
Generalize VARcalcbetween to non-integer types.
diffs (58 lines):
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -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;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list