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

Reply via email to