From 8bb7c8394f4be74e7209e19311d8779277a63108 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 8 Sep 2023 10:40:37 +0800 Subject: [PATCH] [CP] Fix cume_dist/percent_rank bug --- .../window_function/ob_window_function_op.cpp | 16 +++++++++++----- .../resolver/expr/ob_raw_expr_deduce_type.cpp | 6 +++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/sql/engine/window_function/ob_window_function_op.cpp b/src/sql/engine/window_function/ob_window_function_op.cpp index 676c25b0bd..172a5d30f6 100644 --- a/src/sql/engine/window_function/ob_window_function_op.cpp +++ b/src/sql/engine/window_function/ob_window_function_op.cpp @@ -894,8 +894,8 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, ObDatum &expr_datum = wf_info_.expr_->locate_datum_for_write(op_.eval_ctx_); wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); if (T_WIN_FUN_PERCENT_RANK == wf_info_.func_type_) { - if (is_oracle_mode()) { - // result will be zero when only one row within frame + if (ob_is_number_tc(wf_info_.expr_->datum_meta_.type_)) { + //in mysql mode, percent rank may return double if (0 == frame.tail_ - frame.head_) { number::ObNumber res_nmb; res_nmb.set_zero(); @@ -915,7 +915,7 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, expr_datum.set_number(res_nmb); } } - } else { + } else if (ObDoubleType == wf_info_.expr_->datum_meta_.type_) { if (0 == frame.tail_ - frame.head_) { expr_datum.set_double(0); } else { @@ -923,6 +923,9 @@ int ObWindowFunctionOp::NonAggrCellRankLike::eval(RowsReader &row_reader, double denominator= static_cast(frame.tail_ - frame.head_); expr_datum.set_double(numerator / denominator); } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("the result type of window function is unexpected", K(ret), K(wf_info_.expr_->datum_meta_)); } } else if (lib::is_oracle_mode()) { number::ObNumber res_nmb; @@ -1002,7 +1005,7 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, } } if (OB_SUCC(ret)) { - if (is_oracle_mode()) { + if (ob_is_number_tc(wf_info_.expr_->datum_meta_.type_)) { // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) number::ObNumber numerator; // total tuple of current window @@ -1022,7 +1025,7 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, expr_datum.set_number(res_nmb); val = static_cast(expr_datum); } - } else { + } else if (ObDoubleType == wf_info_.expr_->datum_meta_.type_) { // number of row[cur] >= row[:] (whether `>=` or other is depend on ORDER BY) double numerator; // total tuple of current window @@ -1033,6 +1036,9 @@ int ObWindowFunctionOp::NonAggrCellCumeDist::eval(RowsReader &row_reader, wf_info_.expr_->set_evaluated_flag(op_.eval_ctx_); expr_datum.set_double(numerator / denominator); val = static_cast(expr_datum); + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("the result type of window function is unexpected", K(ret), K(wf_info_.expr_->datum_meta_)); } } diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index d67fd2ba95..2a3e3f5666 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -2361,7 +2361,11 @@ int ObRawExprDeduceType::visit(ObWinFunRawExpr &expr) // @TODO : nijia.nj, 细分各种window_funciton if (T_WIN_FUN_CUME_DIST == expr.get_func_type() || T_WIN_FUN_PERCENT_RANK == expr.get_func_type()) { - if (is_oracle_mode()) { + const uint64_t ob_version = GET_MIN_CLUSTER_VERSION(); + if (is_oracle_mode() || + !((ob_version >= CLUSTER_VERSION_2277 && ob_version < CLUSTER_VERSION_3000) + || (ob_version >= CLUSTER_VERSION_312 && ob_version < CLUSTER_VERSION_3200) + || ob_version >= CLUSTER_VERSION_3_2_3_0)) { result_type.set_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); result_type.set_calc_accuracy(ObAccuracy::MAX_ACCURACY2[ORACLE_MODE][ObNumberType]); result_type.set_number();