From 3faf4cd834158191d05e014859c4a48f7e855a76 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 9 Feb 2024 12:05:41 +0000 Subject: [PATCH] fix to_char: to_char(Nan) get 0 ==> 'Nan' --- .../engine/expr/ob_expr_oracle_to_char.cpp | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 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 be78a33ff..8479f7c6b 100644 --- a/src/sql/engine/expr/ob_expr_oracle_to_char.cpp +++ b/src/sql/engine/expr/ob_expr_oracle_to_char.cpp @@ -984,11 +984,23 @@ int ObExprToCharCommon::process_number_sci_value( LOG_WARN("allocate memory for number string failed", K(ret)); } else { if (is_double) { - str_len = ob_gcvt_opt(input.get_double(), OB_GCVT_ARG_DOUBLE, - static_cast(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE); + double val = input.get_double(); + if (isnan(fabs(val)) || fabs(val) == INFINITY){ + str_len = strlen("Nan"); + strncpy(buf, "Nan", str_len); + } else { + str_len = ob_gcvt_opt(val, OB_GCVT_ARG_DOUBLE, + static_cast(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE); + } } else if (is_float) { - str_len = ob_gcvt_opt(input.get_float(), OB_GCVT_ARG_FLOAT, - static_cast(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE); + float val = input.get_float(); + if (isnan(fabs(val)) || fabs(val) == INFINITY){ + str_len = strlen("Nan"); + strncpy(buf, "Nan", str_len); + } else { + str_len = ob_gcvt_opt(val, OB_GCVT_ARG_FLOAT, + static_cast(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE); + } } else if (is_decimal_int) { ObScale in_scale = expr.args_[0]->datum_meta_.scale_; if (OB_FAIL(wide::to_string(input.get_decimal_int(), input.get_int_bytes(),