Changeset: f5004e7118b8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f5004e7118b8
Modified Files:
monetdb5/modules/mal/mal_weld.c
monetdb5/modules/mal/mal_weld.h
sql/backends/monet5/rel_weld.c
Branch: rel-weld
Log Message:
rel_weld handle scale mismatch in e_convert
diffs (77 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
@@ -68,6 +68,25 @@ str getWeldType(int type) {
return NULL;
}
+str getWeldTypeSuffix(int type) {
+ if (type == TYPE_bte)
+ return "c";
+ if (type == TYPE_sht)
+ return "si";
+ else if (type == TYPE_int)
+ return "";
+ else if (type == TYPE_lng)
+ return "L";
+ else if (type == TYPE_flt)
+ return "f";
+ else if (type == TYPE_dbl)
+ return "";
+ else if (ATOMstorage(type) != type)
+ return getWeldType(ATOMstorage(type));
+ else
+ return NULL;
+}
+
static str getWeldUTypeFromWidth(int width) {
if (width == 1)
return "u8";
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
@@ -17,6 +17,7 @@
mal_export void dumpWeldProgram(str program, FILE *f);
mal_export void getOrSetStructMember(char **addr, int type, const void *value,
int op);
mal_export str getWeldType(int type);
+mal_export str getWeldTypeSuffix(int type);
mal_export str WeldRun(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
#endif
diff --git a/sql/backends/monet5/rel_weld.c b/sql/backends/monet5/rel_weld.c
--- a/sql/backends/monet5/rel_weld.c
+++ b/sql/backends/monet5/rel_weld.c
@@ -273,13 +273,32 @@ exp_to_weld(backend *be, weld_state *wst
}
switch (exp->type) {
case e_convert: {
- str conv_to = getWeldType(exp->tpe.type->localtype);
+ sql_subtype *from = ((list*)exp->r)->h->data;
+ sql_subtype *to = ((list*)exp->r)->h->next->data;
+ str conv_to = getWeldType(to->type->localtype);
if (strcmp(conv_to, "vec[i8]") == 0) {
/* Do nothing */
exp_to_weld(be, wstate, exp->l);
} else {
wprintf(wstate, "%s(", conv_to);
exp_to_weld(be, wstate, exp->l);
+ int scale_diff = to->scale - from->scale;
+ if (scale_diff != 0) {
+ if (scale_diff < 0) {
+ wprintf(wstate, " / 1");
+ scale_diff = -scale_diff;
+ } else {
+ wprintf(wstate, " * 1");
+ }
+ while (scale_diff--) {
+ wprintf(wstate, "0");
+ }
+ str conv_from =
getWeldType(from->type->localtype);
+ if (strcmp(conv_from, "f32") == 0 ||
strcmp(conv_from, "f64") == 0) {
+ wprintf(wstate, ".0");
+ }
+ wprintf(wstate, "%s",
getWeldTypeSuffix(from->type->localtype));
+ }
wprintf(wstate, ")");
}
break;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list