From 864a26e603170ba8f72037bdfd1fb3980a2b4a99 Mon Sep 17 00:00:00 2001 From: Zach41 Date: Thu, 7 Dec 2023 07:16:15 +0000 Subject: [PATCH] Fix type deduction error for sum aggregation --- src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 9efd88c80..f01e075f9 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -1632,7 +1632,12 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr &expr) // But for expression like sum(sum()), the outer sum() is generated by // aggregation pushdown, so we don't need to accumulate precision for the outer expr. if (T_FUN_SUM == expr.get_expr_type() && T_FUN_SUM != child_expr->get_expr_type()) { - if (ob_is_integer_type(obj_type)) { + if (child_expr->get_expr_type() == T_FUN_SYS_CAST + && child_expr->has_flag(IS_OP_OPERAND_IMPLICIT_CAST) + && ob_is_decimal_int(obj_type)) { + // child is implicit cast expr means precision already adjusted + // do nothing + } else if (ob_is_integer_type(obj_type)) { const int16_t int_max_prec = ObAccuracy::MAX_ACCURACY2[0/*mysql mode*/][obj_type].get_precision(); result_precision = MAX(result_precision, int_max_prec) + OB_DECIMAL_LONGLONG_DIGITS; result_precision = MIN(OB_MAX_DECIMAL_PRECISION, result_precision); @@ -1891,7 +1896,7 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr &expr) expr.unset_result_flag(ZEROFILL_FLAG); } } - + LOG_DEBUG("aggregate function deduced result type", K(result_type), K(need_add_cast), K(expr)); if (OB_SUCC(ret) && need_add_cast) { result_type.set_calc_type(result_type.get_type()); result_type.set_calc_accuracy(result_type.get_accuracy());