Changeset: 315fda975d9c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=315fda975d9c
Modified Files:
monetdb5/modules/mal/mal_weld.c
monetdb5/modules/mal/mal_weld.mal
monetdb5/modules/mal/mal_weld.mal.sh
Branch: mal-weld
Log Message:
aggr.subsum with mismatching types
diffs (94 lines):
diff --git a/monetdb5/modules/mal/mal_weld.c b/monetdb5/modules/mal/mal_weld.c
--- a/monetdb5/modules/mal/mal_weld.c
+++ b/monetdb5/modules/mal/mal_weld.c
@@ -1000,6 +1000,7 @@ WeldGroup(Client cntxt, MalBlkPtr mb, Ma
static str
WeldAggrSub(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, str op, str malfunc)
{
+ (void) malfunc;
int ret = getArg(pci, 0); /* any_1 */
int bid = getArg(pci, 1); /* bat[:any_1] */
int gid = getArg(pci, 2); /* bat[:oid] */
@@ -1009,10 +1010,6 @@ WeldAggrSub(MalBlkPtr mb, MalStkPtr stk,
int bidType = getBatType(getArgType(mb, pci, 1));
int sidType = getArgType(mb, pci, 4);
weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /*
has value */
- /* TODO Weld doesn't yet accept mismatching types for binary ops */
- if (retType != bidType) {
- throw(MAL, malfunc, PROGRAM_NYI": missmatching types in
AggrSum: %s", malfunc);
- }
char identValue[128];
if (strcmp(op, "+") == 0)
@@ -1023,6 +1020,12 @@ WeldAggrSub(MalBlkPtr mb, MalStkPtr stk,
sprintf(identValue, "%sMAX", getWeldType(retType));
else if (strcmp(op, "max") == 0)
sprintf(identValue, "%sMIN", getWeldType(retType));
+ char *cast;
+ if (retType != bidType) {
+ cast = getWeldType(retType);
+ } else {
+ cast = "";
+ }
char weldStmt[STR_SIZE_INC];
sprintf(weldStmt,
@@ -1040,20 +1043,20 @@ WeldAggrSub(MalBlkPtr mb, MalStkPtr stk,
" for(%s, vecmerger[%s, %s](empty), |b, i, oid|"
" let groupId = lookup(v%d, oid - v%dhseqbase);"
" let val = lookup(v%d, oid - v%dhseqbase);"
- " merge(b, {groupId, val})"
+ " merge(b, {groupId, %s(val)})"
" )"
");"
"let v%dhseqbase = 0L;",
- ret, getWeldCandList(sid, s), getWeldType(retType), op, gid,
gid, bid, bid, ret);
+ ret, getWeldCandList(sid, s), getWeldType(retType), op, gid,
gid, bid, bid, cast, ret);
} else {
sprintf(weldStmt + strlen(weldStmt),
"let v%d = result("
" for(zip(v%d, v%d), vecmerger[%s, %s](empty), |b, i, x|"
- " merge(b, {x.$0, x.$1})"
+ " merge(b, {x.$0, %s(x.$1)})"
" )"
");"
"let v%dhseqbase = 0L;",
- ret, gid, bid, getWeldType(retType), op, ret);
+ ret, gid, bid, getWeldType(retType), op, cast, ret);
}
appendWeldStmt(wstate, weldStmt);
return MAL_SUCCEED;
diff --git a/monetdb5/modules/mal/mal_weld.mal
b/monetdb5/modules/mal/mal_weld.mal
--- a/monetdb5/modules/mal/mal_weld.mal
+++ b/monetdb5/modules/mal/mal_weld.mal
@@ -45,11 +45,10 @@ pattern groupgroup(b:bat[:any_1], g:bat[
address WeldGroup
comment "group.groupdone";
-pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit,
abort_on_error:bit, wstate:ptr):bat[:any_1]
+pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit,
abort_on_error:bit, wstate:ptr):bat[:any_3]
address WeldAggrSubSum
comment "aggr.subsum";
-
-pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit, abort_on_error:bit, wstate:ptr):bat[:any_1]
+pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit, abort_on_error:bit, wstate:ptr):bat[:any_3]
address WeldAggrSubSum
comment "aggr.subsum";
diff --git a/monetdb5/modules/mal/mal_weld.mal.sh
b/monetdb5/modules/mal/mal_weld.mal.sh
--- a/monetdb5/modules/mal/mal_weld.mal.sh
+++ b/monetdb5/modules/mal/mal_weld.mal.sh
@@ -55,11 +55,10 @@ pattern groupgroup(b:bat[:any_1], g:bat[
address WeldGroup
comment "group.groupdone";
-pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit,
abort_on_error:bit, wstate:ptr):bat[:any_1]
+pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit,
abort_on_error:bit, wstate:ptr):bat[:any_3]
address WeldAggrSubSum
comment "aggr.subsum";
-
-pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit, abort_on_error:bit, wstate:ptr):bat[:any_1]
+pattern aggrsubsum(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit, abort_on_error:bit, wstate:ptr):bat[:any_3]
address WeldAggrSubSum
comment "aggr.subsum";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list