From f0d7d9d626637a4f45d9d6f6fa740e9800cb1cb7 Mon Sep 17 00:00:00 2001 From: st0 Date: Fri, 4 Mar 2022 11:45:50 +0800 Subject: [PATCH] fix aggregate scale for temporal type bug --- src/sql/engine/expr/ob_expr_ifnull.cpp | 6 +++--- src/sql/engine/expr/ob_expr_nvl.cpp | 4 ++-- src/sql/engine/expr/ob_expr_operator.cpp | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_ifnull.cpp b/src/sql/engine/expr/ob_expr_ifnull.cpp index bb13de18be..0846af58fb 100644 --- a/src/sql/engine/expr/ob_expr_ifnull.cpp +++ b/src/sql/engine/expr/ob_expr_ifnull.cpp @@ -68,9 +68,9 @@ int ObExprIfNull::calc_result_type2( type.set_accuracy(ObAccuracy::DDL_DEFAULT_ACCURACY[ObIntType].get_accuracy()); } - // set scale - ObScale scale1 = type1.get_scale(); - ObScale scale2 = type2.get_scale(); + //set scale + ObScale scale1 = type1.is_null() ? 0 : type1.get_scale(); + ObScale scale2 = type2.is_null() ? 0 : type2.get_scale(); if (-1 != scale1 && -1 != scale2) { type.set_scale(static_cast(max(scale1, scale2))); } else { diff --git a/src/sql/engine/expr/ob_expr_nvl.cpp b/src/sql/engine/expr/ob_expr_nvl.cpp index fd78bfd3c9..566a7ed505 100644 --- a/src/sql/engine/expr/ob_expr_nvl.cpp +++ b/src/sql/engine/expr/ob_expr_nvl.cpp @@ -98,8 +98,8 @@ int ObExprNvl::calc_result_type2( } else { type.set_accuracy(type2.get_accuracy()); } - ObScale scale1 = type1.get_scale(); - ObScale scale2 = type2.get_scale(); + ObScale scale1 = type1.is_null() ? 0 : type1.get_scale(); + ObScale scale2 = type2.is_null() ? 0 : type2.get_scale(); if (-1 != scale1 && -1 != scale2) { type.set_scale(static_cast(max(scale1, scale2))); } else { diff --git a/src/sql/engine/expr/ob_expr_operator.cpp b/src/sql/engine/expr/ob_expr_operator.cpp index 77a07cdbc7..e5dd47ba6c 100644 --- a/src/sql/engine/expr/ob_expr_operator.cpp +++ b/src/sql/engine/expr/ob_expr_operator.cpp @@ -1127,8 +1127,7 @@ int ObExprOperator::aggregate_temporal_accuracy_for_merge( } } if (OB_UNLIKELY(scale < 0)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected scale.", K(ret), K(scale)); + type.set_scale(ObAccuracy::MAX_ACCURACY2[is_oracle_mode()][type.get_type()].get_scale()); } else { type.set_scale(scale); }