Changeset: 6773b036508a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6773b036508a
Modified Files:
monetdb5/modules/mal/batcalc.c
Branch: arrays
Log Message:
delay materialisation a bit more: when a single bat in batcalc functions
then no need to materialise. Beware of the step though
diffs (196 lines):
diff --git a/monetdb5/modules/mal/batcalc.c b/monetdb5/modules/mal/batcalc.c
--- a/monetdb5/modules/mal/batcalc.c
+++ b/monetdb5/modules/mal/batcalc.c
@@ -313,6 +313,7 @@ CMDbatBINARY2(MalBlkPtr mb, MalStkPtr st
bat *bid;
BAT *bn, *b, *s = NULL;
int tp1, tp2, tp3;
+ int isArray = 0;
tp1 = stk->stk[getArg(pci, 1)].vtype;
tp2 = stk->stk[getArg(pci, 2)].vtype;
@@ -334,9 +335,8 @@ CMDbatBINARY2(MalBlkPtr mb, MalStkPtr st
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
if (tp2 == TYPE_bat || isaBatType(tp2)) {
bid = getArgReference_bat(stk, pci, 2);
b2 = BATdescriptor(*bid);
@@ -346,8 +346,11 @@ CMDbatBINARY2(MalBlkPtr mb, MalStkPtr st
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
if(isBATarray(b2))
b2 = materialiseDimensionBAT(b2);
+ isArray = 0;
assert(BAThdense(b2));
}
if (b2) {
@@ -371,19 +374,26 @@ CMDbatBINARY2(MalBlkPtr mb, MalStkPtr st
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
if (tp3 == TYPE_any)
tp3 = (*typefunc)(tp1, b->T->type);
bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s, tp3,
abort_on_error);
}
- BBPunfix(b->batCacheid);
if (bn == NULL) {
+ BBPunfix(b->batCacheid);
return mythrow(MAL, malfunc, OPERATION_FAILED);
}
bid = getArgReference_bat(stk, pci, 0);
+ BATsetArray(bn, isArray);
+ if(isBATarray(bn) && (strchr(malfunc, '+') || strchr(malfunc, '-'))) {
+ //the step has changed and we should put it back to its correct
value
+ BATiter b_iter = bat_iterator(b);
+ oid lastOid = BUNlast(b)-1;
+ BUNreplace(bn, &lastOid, BUNtail(b_iter, lastOid), 1);
+ }
BBPkeepref(*bid = bn->batCacheid);
+ BBPunfix(b->batCacheid);
return MAL_SUCCEED;
}
@@ -398,6 +408,7 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
bat *bid;
BAT *bn, *b, *s = NULL;
int tp1, tp2;
+ int isArray =0 ;
tp1 = stk->stk[getArg(pci, 1)].vtype;
tp2 = stk->stk[getArg(pci, 2)].vtype;
@@ -416,9 +427,8 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
if (tp2 == TYPE_bat || isaBatType(tp2)) {
bid = getArgReference_bat(stk, pci, 2);
b2 = BATdescriptor(*bid);
@@ -428,8 +438,11 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
if(isBATarray(b2))
b2 = materialiseDimensionBAT(b2);
+ isArray = 0;
assert(BAThdense(b2));
}
if (b2) {
@@ -448,19 +461,27 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s,
abort_on_error);
}
+ if (bn == NULL) {
+ BBPunfix(b->batCacheid);
+ if (s)
+ BBPunfix(s->batCacheid);
+ return mythrow(MAL, malfunc, OPERATION_FAILED);
+ }
+ bid = getArgReference_bat(stk, pci, 0);
+ BATsetArray(bn, isArray);
+ if(isBATarray(bn) && (strchr(malfunc, '+') || strchr(malfunc, '-'))) {
+ //the step has changed and we should put it back to its correct
value
+ BATiter b_iter = bat_iterator(b);
+ oid lastOid = BUNlast(b)-1;
+ BUNreplace(bn, &lastOid, BUNtail(b_iter, lastOid), 1);
+ } BBPkeepref(*bid = bn->batCacheid);
BBPunfix(b->batCacheid);
if (s)
BBPunfix(s->batCacheid);
- if (bn == NULL) {
- return mythrow(MAL, malfunc, OPERATION_FAILED);
- }
- bid = getArgReference_bat(stk, pci, 0);
- BBPkeepref(*bid = bn->batCacheid);
return MAL_SUCCEED;
}
@@ -474,6 +495,7 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
bat *bid;
BAT *bn, *b, *s = NULL;
int tp1, tp2;
+ int isArray = 0;
tp1 = stk->stk[getArg(pci, 1)].vtype;
tp2 = stk->stk[getArg(pci, 2)].vtype;
@@ -492,9 +514,8 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
if (tp2 == TYPE_bat || isaBatType(tp2)) {
bid = getArgReference_bat(stk, pci, 2);
b2 = BATdescriptor(*bid);
@@ -504,8 +525,11 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
+ if(isBATarray(b))
+ b = materialiseDimensionBAT(b);
if(isBATarray(b2))
b2 = materialiseDimensionBAT(b2);
+ isArray = 0;
assert(BAThdense(b2));
}
if (b2) {
@@ -531,19 +555,27 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
BBPunfix(s->batCacheid);
throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
}
- if(isBATarray(b))
- b = materialiseDimensionBAT(b);
assert(BAThdense(b));
+ isArray = isBATarray(b);
bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s);
}
+ if (bn == NULL) {
+ BBPunfix(b->batCacheid);
+ if (s)
+ BBPunfix(s->batCacheid);
+ return mythrow(MAL, malfunc, OPERATION_FAILED);
+ }
+ bid = getArgReference_bat(stk, pci, 0);
+ BATsetArray(bn, isArray);
+ if(isBATarray(bn) && (strchr(malfunc, '+') || strchr(malfunc, '-'))) {
+ //the step has changed and we should put it back to its correct
value
+ BATiter b_iter = bat_iterator(b);
+ oid lastOid = BUNlast(b)-1;
+ BUNreplace(bn, &lastOid, BUNtail(b_iter, lastOid), 1);
+ } BBPkeepref(*bid = bn->batCacheid);
BBPunfix(b->batCacheid);
if (s)
BBPunfix(s->batCacheid);
- if (bn == NULL) {
- return mythrow(MAL, malfunc, OPERATION_FAILED);
- }
- bid = getArgReference_bat(stk, pci, 0);
- BBPkeepref(*bid = bn->batCacheid);
return MAL_SUCCEED;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list