diff --git a/src/backend/gporca/libgpopt/src/engine/CStatisticsConfig.cpp b/src/backend/gporca/libgpopt/src/engine/CStatisticsConfig.cpp index 885a809d5f0..f26fd3025bd 100644 --- a/src/backend/gporca/libgpopt/src/engine/CStatisticsConfig.cpp +++ b/src/backend/gporca/libgpopt/src/engine/CStatisticsConfig.cpp @@ -41,9 +41,9 @@ CStatisticsConfig::CStatisticsConfig(CMemoryPool *mp, m_max_stats_buckets(max_stats_buckets), m_phsmdidcolinfo(nullptr) { - GPOS_ASSERT(CDouble(0.0) < damping_factor_filter); + GPOS_ASSERT(CDouble(0.0) <= damping_factor_filter); GPOS_ASSERT(CDouble(0.0) <= damping_factor_join); - GPOS_ASSERT(CDouble(0.0) < damping_factor_groupby); + GPOS_ASSERT(CDouble(0.0) <= damping_factor_groupby); GPOS_ASSERT(0 < max_stats_buckets); //m_phmmdidcolinfo = New(m_mp) HMMDIdMissingstatscol(m_mp); diff --git a/src/backend/gporca/libnaucrates/src/statistics/CScaleFactorUtils.cpp b/src/backend/gporca/libnaucrates/src/statistics/CScaleFactorUtils.cpp index d6e078bd7e9..658eb68caf4 100644 --- a/src/backend/gporca/libnaucrates/src/statistics/CScaleFactorUtils.cpp +++ b/src/backend/gporca/libnaucrates/src/statistics/CScaleFactorUtils.cpp @@ -502,12 +502,25 @@ CScaleFactorUtils::CalcScaleFactorCumulativeConj( const ULONG num_cols = scale_factors->Size(); CDouble scale_factor(1.0); + if (0 == num_cols) + { + return scale_factor; + } + if (1 < num_cols) { // sort (in desc order) the scaling factor based on the selectivity of each column scale_factors->Sort(CScaleFactorUtils::DescendingOrderCmpFunc); } + if (CDouble(0.0) == stats_config->DDampingFactorFilter()) + { + // Maximum overlap: retain only the smallest selectivity, represented + // by the largest scale factor. Handle zero explicitly rather than + // relying on CDouble's minimum magnitude when computing powers. + return std::max(CStatistics::MinRows.Get(), (*scale_factors)[0]->Get()); + } + for (ULONG ul = 0; ul < num_cols; ul++) { // apply damping factor