From 89368e497224b8cd6bee2cbf4e7ff4e7fc6f9598 Mon Sep 17 00:00:00 2001 From: Cerdore Date: Tue, 18 Mar 2025 12:45:42 +0000 Subject: [PATCH] fix to_char for evaluate iso week and format 'tme' issue --- .../engine/expr/ob_expr_oracle_to_char.cpp | 4 ++-- .../engine/expr/ob_number_format_models.cpp | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_oracle_to_char.cpp b/src/sql/engine/expr/ob_expr_oracle_to_char.cpp index f21e88c394..e84814a2dd 100644 --- a/src/sql/engine/expr/ob_expr_oracle_to_char.cpp +++ b/src/sql/engine/expr/ob_expr_oracle_to_char.cpp @@ -1032,7 +1032,7 @@ int ObExprToCharCommon::convert_to_ob_time(ObEvalCtx &ctx, break; } case ObMySQLDateTC: { - ret = ObTimeConverter::mdate_to_ob_time(input.get_mysql_date(), ob_time); + ret = ObTimeConverter::mdate_to_ob_time(input.get_mysql_date(), ob_time); break; } case ObOTimestampTC: { @@ -1050,7 +1050,7 @@ int ObExprToCharCommon::convert_to_ob_time(ObEvalCtx &ctx, break; } case ObMySQLDateTimeTC: { - ret = ObTimeConverter::mdatetime_to_ob_time(input.get_mysql_datetime(), ob_time); + ret = ObTimeConverter::mdatetime_to_ob_time(input.get_mysql_datetime(), ob_time); break; } default: { diff --git a/src/sql/engine/expr/ob_number_format_models.cpp b/src/sql/engine/expr/ob_number_format_models.cpp index 4f6f2fcb6d..25fdc0ea4a 100644 --- a/src/sql/engine/expr/ob_number_format_models.cpp +++ b/src/sql/engine/expr/ob_number_format_models.cpp @@ -1893,6 +1893,16 @@ int ObNFMToChar::process_tm_format(const ObNFMObj &nfm_obj, const int64_t in_sca MEMCPY(buf, num_str_buf, num_str_len); pos += num_str_len; } else if (num_str_len > 64) { + if (lib::is_mysql_mode()) { + // remove '0' before '.' + if (num_str_len > 2 && 0 == MEMCMP(num_str_buf, "0.", 2)) { + MEMMOVE(num_str_buf, num_str_buf + 1, num_str_len - 1); + num_str_len -= 1; + } else if (num_str_len > 3 && 0 == MEMCMP(num_str_buf, "-0.", 3)) { + MEMMOVE(num_str_buf + 1, num_str_buf + 2, num_str_len - 2); + num_str_len -= 1; + } + } if (OB_FAIL(num_str_to_sci(num_str, out_scale, buf, buf_len, pos, true))) { LOG_WARN("failed to convert num to sci str", K(ret)); } @@ -1944,6 +1954,16 @@ int ObNFMToChar::process_tme_format(const ObNFMObj &nfm_obj, const int64_t in_sc LOG_WARN("invalid obj type", K(ret), K(obj_type)); } if (OB_SUCC(ret)) { + if (lib::is_mysql_mode()) { + // remove '0' before '.' + if (num_str_len > 2 && 0 == MEMCMP(num_str_buf, "0.", 2)) { + MEMMOVE(num_str_buf, num_str_buf + 1, num_str_len - 1); + num_str_len -= 1; + } else if (num_str_len > 3 && 0 == MEMCMP(num_str_buf, "-0.", 3)) { + MEMMOVE(num_str_buf + 1, num_str_buf + 2, num_str_len - 2); + num_str_len -= 1; + } + } num_str.assign_ptr(num_str_buf, static_cast(num_str_len)); LOG_DEBUG("process_tme_format", K(ret), K(num_str_buf), K(num_str_len)); if (OB_FAIL(num_str_to_sci(num_str, out_scale, buf, buf_len, pos, true))) {