[fix](string function) fix wrong usage of iconv_open (#17048)
* [fix](string function) fix wrong usage of iconv_open Also add test case for function convert * fix test case
This commit is contained in:
@ -2508,17 +2508,16 @@ public:
|
||||
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());
|
||||
}
|
||||
// IconvWrapper will call iconv_close during deconstructor
|
||||
std::shared_ptr<IconvWrapper> cd_wrapper = std::make_shared<IconvWrapper>(cd);
|
||||
context->set_function_state(scope, cd_wrapper);
|
||||
} else {
|
||||
return Status::RuntimeError(
|
||||
"Illegal second argument column of function convert. now only support "
|
||||
"convert to character set of gbk");
|
||||
return Status::NotSupported("convert to character set " + character_data.to_string());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
@ -2549,7 +2548,8 @@ public:
|
||||
char* in = const_cast<char*>(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();
|
||||
|
||||
@ -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 ˿�
|
||||
|
||||
@ -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_IMPLEMENTED_ERROR]"
|
||||
}
|
||||
|
||||
qt_convert_const_to_gbk """select convert("a" using gbk), convert("丝" using gbk);"""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user