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