Changeset: a4ca359a62d1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a4ca359a62d1 Modified Files: monetdb5/modules/mal/mal_weld.c monetdb5/modules/mal/mal_weld.h monetdb5/modules/mal/mal_weld.mal monetdb5/modules/mal/mal_weld.mal.sh monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h monetdb5/optimizer/opt_weld.c Branch: mal-weld Log Message:
weld impl for batcalc.[/ % == < <= > >= !=] diffs (truncated from 1417 to 300 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 @@ -438,7 +438,7 @@ WeldAlgebraSelect1(Client cntxt, MalBlkP weldState *wstate = *getArgReference_ptr(stk, pci, 7); /* has value */ char *lCmp, *op, *rCmp; - char x[STR_SIZE_INC], weldStmt[STR_SIZE_INC]; + char weldStmt[STR_SIZE_INC]; /* Inspired from gdk_select.c */ if (!anti) { @@ -601,7 +601,13 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt throw(MAL, malfunc, PROGRAM_NYI); } - char weldStmt[STR_SIZE_INC]; + char weldStmt[STR_SIZE_INC], *cast; + if (getBatType(getArgType(mb, pci, 0)) == TYPE_bit) { + cast = any_1; + } else { + cast = ""; + } + if (sid != -1) { char leftStmt[STR_SIZE_INC]; char rightStmt[STR_SIZE_INC]; @@ -618,40 +624,40 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt sprintf(weldStmt, "let v%d = result(" - " for (%s, appender[%s], |b, i, oid|" - " merge(b, %s %s %s)" + " for (%s, appender[?], |b, i, oid|" + " merge(b, %s(%s %s %s))" " )" ");" "let v%dhseqbase = 0L;", - ret, getWeldCandList(sid, s), any_1, leftStmt, op, rightStmt, ret); + ret, getWeldCandList(sid, s), cast, leftStmt, op, rightStmt, ret); } else { if (isaBatType(leftType) && isaBatType(rightType)) { sprintf(weldStmt, "let v%d = result(" - " for (zip(v%d, v%d), appender[%s], |b , i, x|" - " merge(b, x.$0 %s x.$1)" + " for (zip(v%d, v%d), appender[?], |b , i, x|" + " merge(b, %s(x.$0 %s x.$1))" " )" ");" "let v%dhseqbase = 0L;", - ret, left, right, any_1, op, ret); + ret, left, right, cast, op, ret); } else if (isaBatType(leftType)) { sprintf(weldStmt, "let v%d = result(" - " for (v%d, appender[%s], |b, i, x|" - " merge(b, x %s v%d)" + " for (v%d, appender[?], |b, i, x|" + " merge(b, %s(x %s v%d))" " )" ");" "let v%dhseqbase = 0L;", - ret, left, any_1, op, right, ret); + ret, left, cast, op, right, ret); } else if (isaBatType(rightType)) { sprintf(weldStmt, "let v%d = result(" - " for (v%d, appender[%s], |b, i, x|" - " merge(b, v%d %s x)" + " for (v%d, appender[?], |b, i, x|" + " merge(b, %s(v%d %s x))" " )" ");" "let v%dhseqbase = 0L;", - ret, right, any_1, left, op, ret); + ret, right, cast, left, op, ret); } } appendWeldStmt(wstate, weldStmt); @@ -679,6 +685,61 @@ WeldBatcalcMULsignal(Client cntxt, MalBl return WeldBatcalcBinary(mb, stk, pci, "*", "weld.batcalcmul"); } +str +WeldBatcalcDIVsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "/", "weld.batcalcdiv"); +} + +str +WeldBatcalcLTsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "<", "weld.batcalclt"); +} + +str +WeldBatcalcLEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "<=", "weld.batcalcle"); +} +str +WeldBatcalcEQsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "==", "weld.batcalceq"); +} + +str +WeldBatcalcGTsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, ">", "weld.batcalcgt"); +} + +str +WeldBatcalcGEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, ">=", "weld.batcalcge"); +} + +str +WeldBatcalcNEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "!=", "weld.batcalcne"); +} + +str +WeldBatcalcMODsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + return WeldBatcalcBinary(mb, stk, pci, "%", "weld.batcalcmod"); +} + /* Ignore the existing groups and instead use all the columns up to this point to * generate the new group ids. Weld will remove the unnecessary computations. e.g.: * g1, e1, h1 = group.group(col1) -> for(zip(col1), dictmerger[ty1, i64, min]... diff --git a/monetdb5/modules/mal/mal_weld.h b/monetdb5/modules/mal/mal_weld.h --- a/monetdb5/modules/mal/mal_weld.h +++ b/monetdb5/modules/mal/mal_weld.h @@ -29,6 +29,14 @@ mal_export str WeldAlgebraThetaselect2(C mal_export str WeldBatcalcADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldBatcalcSUBsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldBatcalcMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcDIVsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcMODsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcLTsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcLEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcEQsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcGTsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcGEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatcalcNEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldGroup(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldAggrSubSum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldAggrSubProd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); 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 @@ -1545,6 +1545,1070 @@ pattern batcalcmul(v:dbl, b:bat[:dbl], s address WeldBatcalcMULsignal comment "batcalcmul with candidates list"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:bte], wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:bte], s:bat[:oid], wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:bte], v:bte, wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:bte], v:bte, s:bat[:oid], wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:bte, b:bat[:bte], wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:bte, b:bat[:bte], s:bat[:oid], wstate:ptr):bat[:bte] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:bte], b2:bat[:int], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:int], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:bte], v:int, wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:bte], v:int, s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:bte, b:bat[:int], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:bte, b:bat[:int], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:bte], b2:bat[:lng], wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:lng], s:bat[:oid], wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:bte], v:lng, wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:bte], v:lng, s:bat[:oid], wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:bte, b:bat[:lng], wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:bte, b:bat[:lng], s:bat[:oid], wstate:ptr):bat[:lng] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:bte], b2:bat[:flt], wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:flt], s:bat[:oid], wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:bte], v:flt, wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:bte], v:flt, s:bat[:oid], wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:bte, b:bat[:flt], wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:bte, b:bat[:flt], s:bat[:oid], wstate:ptr):bat[:flt] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:bte], b2:bat[:dbl], wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:bte], b2:bat[:dbl], s:bat[:oid], wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:bte], v:dbl, wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:bte], v:dbl, s:bat[:oid], wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:bte, b:bat[:dbl], wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:bte, b:bat[:dbl], s:bat[:oid], wstate:ptr):bat[:dbl] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:int], b2:bat[:bte], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:int], b2:bat[:bte], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:int], v:bte, wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:int], v:bte, s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:int, b:bat[:bte], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:int, b:bat[:bte], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + +pattern batcalcdiv(b1:bat[:int], b2:bat[:int], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b1:bat[:int], b2:bat[:int], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(b:bat[:int], v:int, wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(b:bat[:int], v:int, s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; +pattern batcalcdiv(v:int, b:bat[:int], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv"; +pattern batcalcdiv(v:int, b:bat[:int], s:bat[:oid], wstate:ptr):bat[:int] +address WeldBatcalcDIVsignal +comment "batcalcdiv with candidates list"; + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list