From aa5081efcf34a566df2d6a6d2bf163dc68941551 Mon Sep 17 00:00:00 2001 From: TengJianPing Date: Thu, 11 Jun 2026 14:37:42 +0800 Subject: [PATCH] [fix](be) Return NaN for avg_weighted when sum of weights is zero (#64333) Problem Summary: When the sum of weights passed to avg_weighted is zero but the weighted data sum is non-zero, the function computed data_sum / weight_sum and returned +/-Infinity (e.g. avg_weighted(f1, f2) over rows (1, 1), (2, -1) returned -Infinity). The expected mathematical result of a division by zero weight is undefined, so it should return NaN. This fixes AggregateFunctionAvgWeightedData::get() to return quiet_NaN() when weight_sum is exactly zero, instead of producing Infinity. --- .../aggregate/aggregate_function_avg_weighted.h | 8 +++++++- .../support_type/avg_weighted/avg_weighted.out | 3 +++ .../support_type/avg_weighted/avg_weighted.groovy | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/be/src/exprs/aggregate/aggregate_function_avg_weighted.h b/be/src/exprs/aggregate/aggregate_function_avg_weighted.h index 75643457d96f2e..261d068e7463ae 100644 --- a/be/src/exprs/aggregate/aggregate_function_avg_weighted.h +++ b/be/src/exprs/aggregate/aggregate_function_avg_weighted.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -77,7 +78,12 @@ struct AggregateFunctionAvgWeightedData { weight_sum = 0.0; } - double get() const { return data_sum / weight_sum; } + double get() const { + if (weight_sum == 0.0) { + return std::numeric_limits::quiet_NaN(); + } + return data_sum / weight_sum; + } double data_sum = 0.0; double weight_sum = 0.0; diff --git a/regression-test/data/query_p0/aggregate/support_type/avg_weighted/avg_weighted.out b/regression-test/data/query_p0/aggregate/support_type/avg_weighted/avg_weighted.out index f7365ee6724c96..dd8b4f7056b32a 100644 --- a/regression-test/data/query_p0/aggregate/support_type/avg_weighted/avg_weighted.out +++ b/regression-test/data/query_p0/aggregate/support_type/avg_weighted/avg_weighted.out @@ -2,3 +2,6 @@ -- !sql_double -- 2.718281828 +-- !sql_zero_weight -- +NaN + diff --git a/regression-test/suites/query_p0/aggregate/support_type/avg_weighted/avg_weighted.groovy b/regression-test/suites/query_p0/aggregate/support_type/avg_weighted/avg_weighted.groovy index f49adef5d8ce7e..755adb4119694c 100644 --- a/regression-test/suites/query_p0/aggregate/support_type/avg_weighted/avg_weighted.groovy +++ b/regression-test/suites/query_p0/aggregate/support_type/avg_weighted/avg_weighted.groovy @@ -43,4 +43,18 @@ suite("avg_weighted") { """ qt_sql_double """select avg_weighted(col_double, weight_double) from d_table;""" + + // weight sum is zero, should return NaN instead of +/-Infinity + sql """ + drop table if exists test_avg_weighted_zero; + """ + sql """ + create table test_avg_weighted_zero (f1 int, f2 int) + distributed BY hash(f1) buckets 1 + properties("replication_num" = "1"); + """ + sql """ + insert into test_avg_weighted_zero values (1, 1), (2, -1); + """ + qt_sql_zero_weight """select avg_weighted(f1, f2) from test_avg_weighted_zero;""" } \ No newline at end of file