Changeset: 21499f3c05c0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21499f3c05c0
Modified Files:
        monetdb5/modules/mal/mal_weld.c
Branch: mal-weld
Log Message:

weld batcalc binary mismatching types support


diffs (78 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
@@ -321,6 +321,7 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
                                                        b->ttype = in->ttype;
                                                        b->twidth = in->twidth;
                                                        b->tshift = in->tshift;
+                                                       b->tsorted = 
in->tsorted;
                                                        b->tvarsized = 1;
                                                        break;
                                                }
@@ -577,9 +578,6 @@ WeldAlgebraThetaselect1(Client cntxt, Ma
        weldState *wstate = *getArgReference_ptr(stk, pci, 4); /* has value */
        char weldStmt[STR_SIZE_INC];
        if (valType == TYPE_str) {
-               if (strcmp(op, "==") != 0) {
-                       throw(MAL, "weld.algebrathetaselect", PROGRAM_NYI": str 
thetaselect only supports ==");
-               }
                sprintf(weldStmt,
                "let v%d = result("
                "       for (v%d, appender[i64], |b, i, x|"
@@ -678,15 +676,21 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt
        int rightType = getArgType(mb, pci, 2);
        str any_1 = getWeldType(getBatType(getArgType(mb, pci, 0)));
 
-       if (getBatType(leftType) != getBatType(rightType)) {
-               throw(MAL, malfunc, PROGRAM_NYI": missmatching types in 
BatcalcBinary: %s", malfunc);
+
+       char weldStmt[STR_SIZE_INC], *resCast, *leftCast, *rightCast;
+       if (getBatType(getArgType(mb, pci, 0)) == TYPE_bit) {
+               resCast = any_1;
+       } else {
+               resCast = "";
        }
 
-       char weldStmt[STR_SIZE_INC], *cast;
-       if (getBatType(getArgType(mb, pci, 0)) == TYPE_bit) {
-               cast = any_1;
-       } else {
-               cast = "";
+       /* Check if we have mismatching types and we need to cast */
+       leftCast = "";
+       rightCast = "";
+       if (getBatType(leftType) > getBatType(rightType)) {
+               rightCast = getWeldType(getBatType(leftType));
+       } else if (getBatType(leftType) < getBatType(rightType)) {
+               leftCast = getWeldType(getBatType(rightType));
        }
 
        if (sid != -1) {
@@ -718,11 +722,11 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt
                sprintf(weldStmt,
                "let v%d = result("
                "       for (%s, appender[?], |b, i, oid|"
-               "               merge(b, %s(%s %s %s))"
+               "               merge(b, %s(%s(%s) %s %s(%s)))"
                "       )"
                ");"
                "let v%dhseqbase = 0L;",
-               ret, getWeldCandList(sid, s), cast, leftStmt, op, rightStmt, 
ret);
+               ret, getWeldCandList(sid, s), resCast, leftCast, leftStmt, op, 
rightCast, rightStmt, ret);
        } else {
                char forStmt[64];
                char leftStmt[512], rightStmt[512];
@@ -755,11 +759,11 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt
                sprintf(weldStmt,
                "let v%d = result("
                "       for (%s, appender[?], |b , i, x|"
-               "               merge(b, %s(%s %s %s))"
+               "               merge(b, %s(%s(%s) %s %s(%s)))"
                "       )"
                ");"
                "let v%dhseqbase = 0L;",
-               ret, forStmt, cast, leftStmt, op, rightStmt, ret);
+               ret, forStmt, resCast, leftCast, leftStmt, op, rightCast, 
rightStmt, ret);
        }
        appendWeldStmt(wstate, weldStmt);
        return MAL_SUCCEED;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to