diff --git a/src/sql/optimizer/ob_opt_selectivity.cpp b/src/sql/optimizer/ob_opt_selectivity.cpp index 5ee26e5cd6..2ca8d2dc8a 100644 --- a/src/sql/optimizer/ob_opt_selectivity.cpp +++ b/src/sql/optimizer/ob_opt_selectivity.cpp @@ -31,7 +31,7 @@ #include "share/stat/ob_dbms_stats_utils.h" #include "sql/optimizer/ob_access_path_estimation.h" #include "sql/optimizer/ob_sel_estimator.h" - +#include "sql/optimizer/ob_opt_est_utils.h" using namespace oceanbase::common; using namespace oceanbase::share::schema; namespace oceanbase @@ -2378,7 +2378,7 @@ int ObOptSelectivity::calculate_special_ndv(const OptTableMetas &table_metas, } else if (T_WIN_FUN_NTILE == win_expr->get_func_type()) { ObSEArray param_exprs; ObRawExpr* const_expr = NULL; - ObObj result; + ObObj result,out_ptr; bool got_result = false; const ParamStore *params = ctx.get_params(); if (OB_FAIL(param_exprs.assign(win_expr->get_func_params()))) { @@ -2395,9 +2395,11 @@ int ObOptSelectivity::calculate_special_ndv(const OptTableMetas &table_metas, LOG_WARN("fail to calc_const_or_calculable_expr", K(ret)); } else if (!got_result || result.is_null() || !ob_is_numeric_type(result.get_type())) { special_ndv = origin_rows/part_ndv; + } else if (OB_FAIL(ObOptEstObjToScalar::convert_obj_to_scalar_obj(&result, &out_ptr))) { + LOG_WARN("Failed to convert obj using old method", K(ret)); } else { - double n = (double)ObOptEstObjToScalar::convert_obj_to_scalar(&result); - special_ndv = std::min(origin_rows/part_ndv, n); + double scalar = static_cast(out_ptr.get_double()); + special_ndv = std::min(origin_rows/part_ndv, scalar); } } } else if (T_FUN_MIN == win_expr->get_func_type()||