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