Changeset: 242cc2e0c7e5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=242cc2e0c7e5
Modified Files:
monetdb5/modules/mal/mal_weld.c
sql/backends/monet5/rel_weld.c
Branch: rel-weld
Log Message:
rel_weld: check for nil in aggregations
diffs (116 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
@@ -26,6 +26,15 @@
*(TYPE *)(*ADDR) = *(TYPE *)VALUE; /* set */
\
*ADDR += sizeof(TYPE); /* increase */
+struct weldMinMax {
+ char i8min, i8max;
+ int i32min, i32max;
+ long i64min, i64max;
+ float f32min, f32max;
+ double f64min, f64max;
+} weldMinMaxInst = {SCHAR_MIN, SCHAR_MAX, INT_MIN, INT_MAX, LLONG_MIN,
+ LLONG_MAX, FLT_MIN, FLT_MAX, DBL_MIN,
DBL_MAX};
+
void getOrSetStructMember(char **addr, int type, const void *value, int op) {
if (type == TYPE_bte) {
getOrSetStructMemberImpl(addr, char, value, op);
@@ -201,6 +210,9 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
}
}
headerLen += sprintf(program + headerLen,
+ "i8MIN:i8, i8MAX:i8,
i32MIN:i32, i32MAX:i32, i64MIN:i64, i64MAX:i64, "
+ "f32MIN:f32, f32MAX:f32,
f64MIN:f64, f64MAX:f64,");
+ headerLen += sprintf(program + headerLen,
"i8nil:i8, i32nil:i32,
oidnil:i64, i64nil:i64, f32nil:f32, f64nil:f64,");
program[0] = '|';
@@ -258,6 +270,16 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
}
}
}
+ getOrSetStructMember(&inputPtr, TYPE_bte, &weldMinMaxInst.i8min,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_bte, &weldMinMaxInst.i8max,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_int, &weldMinMaxInst.i32min,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_int, &weldMinMaxInst.i32max,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_lng, &weldMinMaxInst.i64min,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_lng, &weldMinMaxInst.i64max,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_flt, &weldMinMaxInst.f32min,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_flt, &weldMinMaxInst.f32max,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_dbl, &weldMinMaxInst.f64min,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_dbl, &weldMinMaxInst.f64max,
OP_SET);
getOrSetStructMember(&inputPtr, TYPE_bte, &bte_nil, OP_SET);
getOrSetStructMember(&inputPtr, TYPE_int, &int_nil, OP_SET);
getOrSetStructMember(&inputPtr, TYPE_lng, &lng_nil, OP_SET);
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
@@ -178,6 +178,32 @@ get_weld_func(sql_subfunc *f) {
}
static str
+get_identity(sql_allocator *sa, str weld_func, str weld_type, int type) {
+ char identity[64];
+ int len = 0;
+ if (strcmp(weld_func, "+") == 0) {
+ len += sprintf(identity + len, "0");
+ if (strcmp(weld_type, "f32") == 0 || strcmp(weld_type, "f64")
== 0) {
+ len += sprintf(identity + len, ".0");
+ }
+ len += sprintf(identity + len, "%s", getWeldTypeSuffix(type));
+ } else if (strcmp(weld_func, "*") == 0) {
+ len += sprintf(identity + len, "1");
+ if (strcmp(weld_type, "f32") == 0 || strcmp(weld_type, "f64")
== 0) {
+ len += sprintf(identity + len, ".0");
+ }
+ len += sprintf(identity + len, "%s", getWeldTypeSuffix(type));
+ } else if (strcmp(weld_func, "min") == 0) {
+ len += sprintf(identity, "MAX%s", weld_type);
+ } else if (strcmp(weld_func, "max") == 0) {
+ len += sprintf(identity + len, "MIN%s", weld_type);
+ } else {
+ return NULL;
+ }
+ return sa_strdup(sa, identity);
+}
+
+static str
get_col_name(sql_allocator *sa, sql_exp *exp, int name_type) {
char col_name[256];
size_t i;
@@ -882,12 +908,31 @@ groupby_produce(backend *be, sql_rel *re
for (en = aggr_exps->h; en; en = en->next) {
exp = en->data;
/* We might have different types when doing the aggregation so
we need to cast */
- str weld_type = getWeldType(exp_subtype(exp)->type->localtype);
+ int type = exp_subtype(exp)->type->localtype;
+ str weld_type = getWeldType(type);
+ if (has_nil(exp) && need_no_nil(exp)) {
+ wprintf(wstate, "if(");
+ }
wprintf(wstate, "%s(", weld_type);
exp_to_weld(be, wstate, exp);
wprintf(wstate, ")");
+ if (has_nil(exp) && need_no_nil(exp)) {
+ /* if (x == TYPEnil, identity, x) */
+ wprintf(wstate, " == %snil, %s, ", weld_type,
get_identity(wstate->sa, aggr_func, weld_type, type));
+ wprintf(wstate, "%s(", weld_type);
+ exp_to_weld(be, wstate, exp);
+ wprintf(wstate, "))");
+ }
if (strcmp(get_func_name(exp->f), "avg") == 0) {
- wprintf(wstate, ", 1L");
+ if (has_nil(exp) && need_no_nil(exp)) {
+ wprintf(wstate, ", if(");
+ wprintf(wstate, "%s(", weld_type);
+ exp_to_weld(be, wstate, exp);
+ wprintf(wstate, ")");
+ wprintf(wstate, " == %snil, 0L, 1L)",
weld_type);
+ } else {
+ wprintf(wstate, ", 1L");
+ }
}
if (en->next != NULL) {
wprintf(wstate, ", ");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list