diff --git a/be/src/vec/functions/function_string.h b/be/src/vec/functions/function_string.h index 3b909f4a8d5538..5b37cc44c5da99 100644 --- a/be/src/vec/functions/function_string.h +++ b/be/src/vec/functions/function_string.h @@ -122,6 +122,7 @@ struct StringOP { static void push_value_string(const std::string_view& string_value, size_t index, ColumnString::Chars& chars, ColumnString::Offsets& offsets) { + DCHECK(string_value.data() != nullptr); ColumnString::check_chars_length(chars.size() + string_value.size(), offsets.size()); chars.insert(string_value.data(), string_value.data() + string_value.size()); @@ -2802,11 +2803,14 @@ class FunctionStringParseUrl : public IFunction { StringRef url_val = url_col->get_data_at(index_check_const(i)); StringRef parse_res; if (UrlParser::parse_url(url_val, url_part, &parse_res)) { + if (parse_res.empty()) [[unlikely]] { + StringOP::push_empty_string(i, res_chars, res_offsets); + continue; + } StringOP::push_value_string(std::string_view(parse_res.data, parse_res.size), i, res_chars, res_offsets); } else { StringOP::push_null_string(i, res_chars, res_offsets, null_map_data); - continue; } } return Status::OK(); diff --git a/be/test/vec/function/function_string_test.cpp b/be/test/vec/function/function_string_test.cpp index 6dc0e4ba42fb7b..2a0326361fd6ec 100644 --- a/be/test/vec/function/function_string_test.cpp +++ b/be/test/vec/function/function_string_test.cpp @@ -2284,7 +2284,8 @@ TEST(function_string_test, function_parse_url_test) { {{std::string( "https://www.facebook.com/aa/bb?returnpage=https://www.facebook.com/"), std::string("HosT")}, - std::string("www.facebook.com")}}; + std::string("www.facebook.com")}, + {{std::string("http://www.baidu.com"), std::string("FILE")}, {std::string("")}}}; check_function_all_arg_comb(func_name, input_types, data_set); } diff --git a/regression-test/data/function_p0/test_function_string.out b/regression-test/data/function_p0/test_function_string.out index 226d3e675f3fa1..6524bb82fc0735 100644 --- a/regression-test/data/function_p0/test_function_string.out +++ b/regression-test/data/function_p0/test_function_string.out @@ -7,3 +7,7 @@ a a a +-- !sql -- +www.facebook.com +www.google.com /test?name=abc&age=20 + diff --git a/regression-test/suites/function_p0/test_function_string.groovy b/regression-test/suites/function_p0/test_function_string.groovy index 5aa46fb6c52f4c..28e4d83233600e 100644 --- a/regression-test/suites/function_p0/test_function_string.groovy +++ b/regression-test/suites/function_p0/test_function_string.groovy @@ -47,4 +47,28 @@ suite("test_function_string") { drop table if exists test_tb_function_space; """ + + sql """ + drop table if exists test_parse_url; + """ + + sql """ + CREATE TABLE `test_parse_url` ( + `id` int NULL, + `url` text NULL + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + DISTRIBUTED BY RANDOM BUCKETS AUTO + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql """ + insert into test_parse_url values (1, 'http://www.facebook.com'), (2, "http://www.google.com/test?name=abc&age=20"); + """ + + qt_sql """ + select parse_url(url, 'HOST') as host, parse_url(url, 'FILE') as file from test_parse_url order by id; + """ }