Changeset: b84d124f1905 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b84d124f1905
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_analytic_func.c
        monetdb5/modules/kernel/algebra.c
        sql/test/analytics/Tests/analytics16.sql
        sql/test/analytics/Tests/analytics16.stable.err
        sql/test/analytics/Tests/analytics16.stable.out
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.err
Branch: default
Log Message:

Merge with Jun2020 branch.


diffs (truncated from 412 to 300 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
@@ -3250,6 +3255,8 @@ BATcalcvariance_sample(dbl *avgp, BAT *b
                        delta2 = (dbl) y - mean2;                       \
                        mean2 += delta2 / n;                            \
                        m2 += delta1 * ((dbl) y - mean2);               \
+                       if (isinf(m2))                  \
+                               goto overflow;          \
                }                                                       \
        } while (0)
 
@@ -3290,6 +3297,9 @@ calccovariance(const void *v1, const voi
        if (n <= (BUN) issample)
                return dbl_nil;
        return m2 / (n - issample);
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
+       return dbl_nil;
 }
 
 dbl
@@ -3335,6 +3345,8 @@ BATcalccovariance_sample(BAT *b1, BAT *b
                        up += delta1 * aux;                             \
                        down1 += delta1 * ((dbl) x - mean1);            \
                        down2 += delta2 * aux;                          \
+                       if (isinf(up) || isinf(down1) || isinf(down2))          
\
+                               goto overflow;          \
                }                                                       \
        } while (0)
 
@@ -3385,6 +3397,9 @@ BATcalccorrelation(BAT *b1, BAT *b2)
        TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT " (" LLFMT " 
usec)\n",
                  ALGOBATPAR(b1), ALGOBATPAR(b2), GDKusec() - t0);
        return aux;
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
+       return dbl_nil;
 }
 
 #define AGGR_STDEV(TYPE)                                               \
@@ -3418,6 +3433,8 @@ BATcalccorrelation(BAT *b1, BAT *b2)
                        } else if (cnts[i] == 1) {                      \
                                dbls[i] = issample ? dbl_nil : 0;       \
                                nils2++;                                \
+                       } else if (isinf(m2[i])) {                      \
+                               goto overflow;          \
                        } else if (variance) {                          \
                                dbls[i] = m2[i] / (cnts[i] - issample); \
                        } else {                                        \
@@ -3588,7 +3605,8 @@ dogroupstdev(BAT **avgb, BAT *b, BAT *g,
                  ALGOOPTBATPAR(bn), ALGOOPTBATPAR(an),
                  func, GDKusec() - t0);
        return bn;
-
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
   alloc_fail:
        if (an)
                BBPreclaim(an);
@@ -3670,6 +3688,8 @@ BATgroupvariance_population(BAT *b, BAT 
                        } else if (cnts[i] == 1) {                      \
                                dbls[i] = issample ? dbl_nil : 0;       \
                                nils2++;                                \
+                       } else if (isinf(m2[i])) {              \
+                               goto overflow;          \
                        } else {                                        \
                                dbls[i] = m2[i] / (cnts[i] - issample); \
                        }                                               \
@@ -3808,6 +3828,8 @@ dogroupcovariance(BAT *b1, BAT *b2, BAT 
                  ALGOOPTBATPAR(bn),
                  func, GDKusec() - t0);
        return bn;
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
   alloc_fail:
        BBPreclaim(bn);
        GDKfree(mean1);
@@ -3868,6 +3890,8 @@ BATgroupcovariance_population(BAT *b1, B
                        if (cnts[i] <= 1 || cnts[i] == BUN_NONE || down1[i] == 
0 || down2[i] == 0) { \
                                dbls[i] = dbl_nil;                      \
                                nils++;                                 \
+                       } else if (isinf(up[i]) || isinf(down1[i]) || 
isinf(down2[i])) {        \
+                               goto overflow;          \
                        } else {                                        \
                                dbls[i] = (up[i] / cnts[i]) / (sqrt(down1[i] / 
cnts[i]) * sqrt(down2[i] / cnts[i])); \
                                assert(!is_dbl_nil(dbls[i]));           \
@@ -4008,6 +4032,8 @@ BATgroupcorrelation(BAT *b1, BAT *b2, BA
                  ALGOOPTBATPAR(bn),
                  GDKusec() - t0);
        return bn;
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
   alloc_fail:
        BBPreclaim(bn);
        GDKfree(mean1);
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -1711,14 +1711,13 @@ GDKanalyticalavg(BAT *r, BAT *b, BAT *s,
                                if (is_##TPE##_nil(v))          \
                                        continue;               \
                                n++;                            \
-                               SUBF_WITH_CHECK((dbl) v, mean, dbl, delta, 
GDK_dbl_max, goto calc_overflow); \
-                               dn = delta / n; \
-                               ADDF_WITH_CHECK(dn, mean, dbl, mean, 
GDK_dbl_max, goto calc_overflow); \
-                               SUBF_WITH_CHECK((dbl) v, mean, dbl, dn, 
GDK_dbl_max, goto calc_overflow); \
-                               MULF4_WITH_CHECK(delta, dn, dbl, dn2, 
GDK_dbl_max, dbl, goto calc_overflow); \
-                               ADDF_WITH_CHECK(m2, dn2, dbl, m2, GDK_dbl_max, 
goto calc_overflow); \
+                               delta = (dbl) v - mean;         \
+                               mean += delta / n;              \
+                               m2 += delta * ((dbl) v - mean); \
                        }                                               \
-                       if (n > SAMPLE) { \
+                       if (isinf(m2)) {        \
+                               goto overflow;          \
+                       } else if (n > SAMPLE) { \
                                *rb = OP; \
                        } else { \
                                *rb = dbl_nil; \
@@ -1743,10 +1742,9 @@ GDKanalyticalavg(BAT *r, BAT *b, BAT *s,
 gdk_return \
 GDKanalytical_##NAME(BAT *r, BAT *b, BAT *s, BAT *e, int tpe) \
 { \
-       bool abort_on_error = true; \
        BUN i = 0, cnt = BATcount(b), n = 0, nils = 0; \
        lng *restrict start, *restrict end; \
-       dbl *restrict rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta, dn, 
dn2; \
+       dbl *restrict rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta; \
  \
        assert(s && e); \
        start = (lng *) Tloc(s, 0); \
@@ -1780,7 +1778,7 @@ GDKanalytical_##NAME(BAT *r, BAT *b, BAT
        r->tnonil = nils == 0; \
        r->tnil = nils > 0; \
        return GDK_SUCCEED; \
-calc_overflow: \
+  overflow: \
        GDKerror("22003!overflow in calculation.\n"); \
        return GDK_FAIL; \
 }
@@ -1809,7 +1807,9 @@ GDK_ANALYTICAL_STDEV_VARIANCE(variance_p
                                mean2 += delta2 / n;            \
                                m2 += delta1 * ((dbl) v2 - mean2);      \
                        }       \
-                       if (n > SAMPLE) { \
+                       if (isinf(m2)) {        \
+                               goto overflow;          \
+                       } else if (n > SAMPLE) { \
                                *rb = OP; \
                        } else { \
                                *rb = dbl_nil; \
@@ -1871,6 +1871,9 @@ GDKanalytical_##NAME(BAT *r, BAT *b1, BA
        r->tnonil = nils == 0; \
        r->tnil = nils > 0; \
        return GDK_SUCCEED; \
+  overflow: \
+       GDKerror("22003!overflow in calculation.\n"); \
+       return GDK_FAIL; \
 }
 
 GDK_ANALYTICAL_COVARIANCE(covariance_samp, 1, m2 / (n - 1))
@@ -1898,7 +1901,9 @@ GDK_ANALYTICAL_COVARIANCE(covariance_pop
                                down1 += delta1 * ((dbl) v1 - mean1);   \
                                down2 += delta2 * aux;  \
                        }       \
-                       if (n != 0 && down1 != 0 && down2 != 0) { \
+                       if (isinf(up) || isinf(down1) || isinf(down2)) {        
\
+                               goto overflow;  \
+                       } else if (n != 0 && down1 != 0 && down2 != 0) { \
                                *rb = (up / n) / (sqrt(down1 / n) * sqrt(down2 
/ n)); \
                                assert(!is_dbl_nil(*rb)); \
                        } else { \
@@ -1957,4 +1962,7 @@ GDKanalytical_correlation(BAT *r, BAT *b
        r->tnonil = nils == 0;
        r->tnil = nils > 0;
        return GDK_SUCCEED;
+  overflow:
+       GDKerror("22003!overflow in calculation.\n");
+       return GDK_FAIL;
 }
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;
 }
diff --git a/sql/test/analytics/Tests/analytics16.sql 
b/sql/test/analytics/Tests/analytics16.sql
--- a/sql/test/analytics/Tests/analytics16.sql
+++ b/sql/test/analytics/Tests/analytics16.sql
@@ -137,3 +137,26 @@ select corr(a1.aa, a1.bb) from analytics
 select corr(a1.aa, a1.bb) from analytics a1 group by bb having a1.bb > (select 
corr(MAX(a1.aa) + a2.aa, MIN(a1.aa) + a2.aa) from analytics a2);
 
 rollback;
+
+CREATE TABLE t0(c0 DOUBLE, c1 INT);
+INSERT INTO t0(c0,c1) VALUES(1E200, 1), (0, 1);
+
+SELECT VAR_POP(c0) FROM t0; --error, overflow
+SELECT STDDEV_POP(c0) FROM t0; --error, overflow
+SELECT COVAR_POP(c0,c0) FROM t0; --error, overflow
+SELECT CORR(c0,c0) FROM t0; --error, overflow
+
+SELECT VAR_POP(c0) FROM t0 GROUP BY c0;
+SELECT STDDEV_POP(c0) FROM t0 GROUP BY c0;
+SELECT CORR(c0,c0) FROM t0 GROUP BY c0;
+
+SELECT VAR_POP(c0) FROM t0 GROUP BY c1;--error, overflow
+SELECT STDDEV_POP(c0) FROM t0 GROUP BY c1; --error, overflow
+SELECT CORR(c0,c0) FROM t0 GROUP BY c1; --error, overflow
+
+SELECT VAR_SAMP(c0) OVER () FROM t0; --error, overflow
+SELECT STDDEV_SAMP(c0) OVER () FROM t0; --error, overflow
+SELECT COVAR_SAMP(c0,c0) OVER () FROM t0; --error, overflow
+SELECT CORR(c0,c0) OVER () FROM t0; --error, overflow
+
+DROP TABLE T0;
diff --git a/sql/test/analytics/Tests/analytics16.stable.err 
b/sql/test/analytics/Tests/analytics16.stable.err
--- a/sql/test/analytics/Tests/analytics16.stable.err
+++ b/sql/test/analytics/Tests/analytics16.stable.err
@@ -5,20 +5,39 @@ stderr of test 'analytics16` in director
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to