From faeedc83d1eb883eaa5a08e132f0daf11535d341 Mon Sep 17 00:00:00 2001 From: jinmaoli Date: Tue, 19 Dec 2023 16:48:06 +0000 Subject: [PATCH] [CP] fix inheriting zerofill attribute incorrectly --- src/sql/ob_sql_utils.cpp | 4 +++- src/sql/ob_sql_utils.h | 1 + src/sql/resolver/expr/ob_raw_expr_util.cpp | 6 ++---- src/sql/rewrite/ob_transform_utils.cpp | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 7b9ca67476..70c150f444 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -1766,6 +1766,7 @@ void ObSQLUtils::get_default_cast_mode(const bool is_explicit_cast, } int ObSQLUtils::get_cast_mode_for_replace(const ObRawExpr *expr, + const ObExprResType &dst_type, const ObSQLSessionInfo *session, ObCastMode &cast_mode) { @@ -1779,7 +1780,8 @@ int ObSQLUtils::get_cast_mode_for_replace(const ObRawExpr *expr, LOG_WARN("failed to get default cast mode", K(ret)); } else if (OB_FAIL(ObSQLUtils::set_cs_level_cast_mode(expr->get_collation_level(), cast_mode))) { LOG_WARN("failed to set cs level cast mode", K(ret)); - } else if (expr->get_result_type().has_result_flag(ZEROFILL_FLAG)) { + } else if (lib::is_mysql_mode() && dst_type.is_string_type() && + expr->get_result_type().has_result_flag(ZEROFILL_FLAG)) { cast_mode |= CM_ADD_ZEROFILL; } cast_mode = CM_SET_BY_TRANSFORMERN(cast_mode); diff --git a/src/sql/ob_sql_utils.h b/src/sql/ob_sql_utils.h index 0b33193580..0b5226382c 100644 --- a/src/sql/ob_sql_utils.h +++ b/src/sql/ob_sql_utils.h @@ -390,6 +390,7 @@ public: static void set_insert_update_scope(common::ObCastMode &cast_mode); static bool is_insert_update_scope(common::ObCastMode &cast_mode); static int get_cast_mode_for_replace(const ObRawExpr *expr, + const ObExprResType &dst_type, const ObSQLSessionInfo *session, ObCastMode &cast_mode); static common::ObCollationLevel transform_cs_level(const common::ObCollationLevel cs_level); diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index 3ca40128e7..a947957ec5 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -3957,10 +3957,8 @@ int ObRawExprUtils::try_add_cast_expr_above(ObRawExprFactory *expr_factory, } // setup zerofill cm // eg: select concat(cast(c_zf as char(10)), cast(col_no_zf as char(10))) from t1; - if (expr.get_result_type().has_result_flag(ZEROFILL_FLAG) && !dst_type.is_decimal_int()) { - // decimal int type do not need zerofill - // create t (a decimal(10, 2) zerofill), - // column a is DECIMAL UNSIGNED, the corresponding backend is ObUNumberType + if (lib::is_mysql_mode() && dst_type.is_string_type() && + expr.get_result_type().has_result_flag(ZEROFILL_FLAG)) { cm_zf |= CM_ZERO_FILL; } if (dst_type.get_cast_mode() != 0) { diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index d531871d40..e597261664 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -4427,7 +4427,8 @@ int ObTransformUtils::add_cast_for_replace(ObRawExprFactory &expr_factory, } else { ObSysFunRawExpr *cast_expr = NULL; ObCastMode cm; - if (OB_FAIL(ObSQLUtils::get_cast_mode_for_replace(from_expr, session_info, cm))) { + if (OB_FAIL(ObSQLUtils::get_cast_mode_for_replace(from_expr, to_expr->get_result_type(), + session_info, cm))) { LOG_WARN("failed to get cast mode for replace", K(ret)); } else if (OB_FAIL(ObRawExprUtils::create_cast_expr(expr_factory, to_expr,