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

Reply via email to