From b540103999454fcf0f23e5164379844442d156c2 Mon Sep 17 00:00:00 2001 From: jacktengg <18241664+jacktengg@users.noreply.github.com> Date: Wed, 22 Feb 2023 17:27:46 +0800 Subject: [PATCH] [fix](string function) fix coredump cause by not supported charset of convert function --- be/src/vec/functions/function_string.h | 17 +++++++----- .../string_functions/test_convert.out | 4 +++ .../string_functions/test_convert.groovy | 26 +++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 regression-test/data/query_p0/sql_functions/string_functions/test_convert.out create mode 100644 regression-test/suites/query_p0/sql_functions/string_functions/test_convert.groovy diff --git a/be/src/vec/functions/function_string.h b/be/src/vec/functions/function_string.h index eae5da53b393a7..285f2b3104aafc 100644 --- a/be/src/vec/functions/function_string.h +++ b/be/src/vec/functions/function_string.h @@ -2387,15 +2387,15 @@ class FunctionConvertTo : public IFunction { const auto& character_data = context->get_constant_col(1)->column_ptr->get_data_at(0); if (doris::iequal(character_data.to_string(), "gbk")) { iconv_t cd = iconv_open("gb2312", "utf-8"); - if (cd == nullptr) { - return Status::RuntimeError("function {} is convert to gbk failed in iconv_open", + if (cd == (iconv_t)-1) { + LOG(WARNING) << "iconv_open error: " << strerror(errno); + return Status::RuntimeError("function {} converting to gbk failed in iconv_open", get_name()); } context->set_function_state(scope, cd); } else { - return Status::RuntimeError( - "Illegal second argument column of function convert. now only support " - "convert to character set of gbk"); + return Status::RuntimeError("Not supported: convert to character set " + + character_data.to_string()); } return Status::OK(); @@ -2425,7 +2425,8 @@ class FunctionConvertTo : public IFunction { char* in = const_cast(value_data); out_len = in_len; if (iconv(cd, &in, &in_len, &out, &out_len) == -1) { - return Status::RuntimeError("function {} is convert to gbk failed in iconv", + LOG(WARNING) << "iconv failed, error: " << strerror(errno); + return Status::RuntimeError("function {} converting to gbk failed in iconv", get_name()); } else { res_offset[i] = res_chars.size(); @@ -2439,7 +2440,9 @@ class FunctionConvertTo : public IFunction { if (scope == FunctionContext::THREAD_LOCAL) { iconv_t cd = reinterpret_cast( context->get_function_state(FunctionContext::THREAD_LOCAL)); - iconv_close(cd); + if (cd) { + iconv_close(cd); + } context->set_function_state(FunctionContext::THREAD_LOCAL, nullptr); } return Status::OK(); diff --git a/regression-test/data/query_p0/sql_functions/string_functions/test_convert.out b/regression-test/data/query_p0/sql_functions/string_functions/test_convert.out new file mode 100644 index 00000000000000..2de201d6685ae6 --- /dev/null +++ b/regression-test/data/query_p0/sql_functions/string_functions/test_convert.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !convert_const_to_gbk -- +a ˿� + diff --git a/regression-test/suites/query_p0/sql_functions/string_functions/test_convert.groovy b/regression-test/suites/query_p0/sql_functions/string_functions/test_convert.groovy new file mode 100644 index 00000000000000..3b5a1d25adf08a --- /dev/null +++ b/regression-test/suites/query_p0/sql_functions/string_functions/test_convert.groovy @@ -0,0 +1,26 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_convert") { + test { + sql "select convert('a' using utf8);" + exception "errCode = 2, detailMessage = Not supported" + } + + qt_convert_const_to_gbk """select convert("a" using gbk), convert("丝" using gbk);""" +} +