Changeset: c36b32a5dc36 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c36b32a5dc36
Modified Files:
gdk/gdk_aggr.c
monetdb5/modules/kernel/algebra.c
Branch: Jun2020
Log Message:
Stop calculating standard deviation/variance in case of overflow.
Also return the appropriate error, not "Type mismatch".
diffs (88 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3135,6 +3135,8 @@ BATgroupquantile_avg(BAT *b, BAT *g, BAT
delta = (dbl) x - mean; \
mean += delta / n; \
m2 += delta * ((dbl) x - mean); \
+ if (isinf(m2)) \
+ goto overflow; \
} \
} while (0)
@@ -3182,6 +3184,9 @@ calcvariance(dbl *restrict avgp, const v
if (avgp)
*avgp = mean;
return m2 / (n - issample);
+ overflow:
+ GDKerror("22003!overflow in calculation.\n");
+ return dbl_nil;
}
dbl
diff --git a/monetdb5/modules/kernel/algebra.c
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -1263,7 +1263,7 @@ ALGstdev(dbl *res, const bat *bid)
stdev = BATcalcstdev_sample(NULL, b);
BBPunfix(b->batCacheid);
if (is_dbl_nil(stdev) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.stdev", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.stdev", GDK_EXCEPTION);
*res = stdev;
return MAL_SUCCEED;
}
@@ -1279,7 +1279,7 @@ ALGstdevp(dbl *res, const bat *bid)
stdev = BATcalcstdev_population(NULL, b);
BBPunfix(b->batCacheid);
if (is_dbl_nil(stdev) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.stdevp", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.stdevp", GDK_EXCEPTION);
*res = stdev;
return MAL_SUCCEED;
}
@@ -1298,7 +1298,7 @@ ALGvariance(dbl *res, const bat *bid)
variance = BATcalcvariance_sample(NULL, b);
BBPunfix(b->batCacheid);
if (is_dbl_nil(variance) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.variance", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.variance", GDK_EXCEPTION);
*res = variance;
return MAL_SUCCEED;
}
@@ -1314,7 +1314,7 @@ ALGvariancep(dbl *res, const bat *bid)
variance = BATcalcvariance_population(NULL, b);
BBPunfix(b->batCacheid);
if (is_dbl_nil(variance) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.variancep", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.variancep", GDK_EXCEPTION);
*res = variance;
return MAL_SUCCEED;
}
@@ -1339,7 +1339,7 @@ ALGcovariance(dbl *res, const bat *bid1,
BBPunfix(b1->batCacheid);
BBPunfix(b2->batCacheid);
if (is_dbl_nil(covariance) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.covariance", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.covariance", GDK_EXCEPTION);
*res = covariance;
return MAL_SUCCEED;
}
@@ -1361,7 +1361,7 @@ ALGcovariancep(dbl *res, const bat *bid1
BBPunfix(b1->batCacheid);
BBPunfix(b2->batCacheid);
if (is_dbl_nil(covariance) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.covariancep", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.covariancep", GDK_EXCEPTION);
*res = covariance;
return MAL_SUCCEED;
}
@@ -1386,7 +1386,7 @@ ALGcorr(dbl *res, const bat *bid1, const
BBPunfix(b1->batCacheid);
BBPunfix(b2->batCacheid);
if (is_dbl_nil(covariance) && GDKerrbuf && GDKerrbuf[0])
- throw(MAL, "aggr.corr", SEMANTIC_TYPE_MISMATCH);
+ throw(MAL, "aggr.corr", GDK_EXCEPTION);
*res = covariance;
return MAL_SUCCEED;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list