This is an automated email from the ASF dual-hosted git repository. xuyang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new b8b18e5153 [enhancement](array-type) Handle cast empty string value to array (#13028) b8b18e5153 is described below commit b8b18e51533bb59044df0fc35ec61fc54d928907 Author: xy720 <22125576+xy...@users.noreply.github.com> AuthorDate: Sat Oct 8 21:45:42 2022 +0800 [enhancement](array-type) Handle cast empty string value to array (#13028) Handle empty value between two comma when cast string to array type. before: mysql> select cast("[a,b,c,,,,]" as array<string>); +-----------------------------------+ | CAST('[a,b,c,,,,]' AS ARRAY<TEXT>) | +-----------------------------------+ | ['a', 'b', 'c', ',', ','] | +-----------------------------------+ 1 row in set (0.01 sec) after: mysql> select cast("[a,b,c,,,,]" as array<string>); +-----------------------------------+ | CAST('[a,b,c,,,,]' AS ARRAY<TEXT>) | +-----------------------------------+ | ['a', 'b', 'c', '', '', ''] | +-----------------------------------+ 1 row in set (0.01 sec) --- be/src/vec/data_types/data_type_array.cpp | 17 +++++++-- .../test_cast_array_function.out | 0 .../cast_function/test_cast_string_to_array.out | 27 ++++++++++++++ .../test_cast_array_function.groovy | 0 .../test_cast_array_functions_by_literal.groovy | 0 .../cast_function/test_cast_string_to_array.groovy | 42 ++++++++++++++++++++++ 6 files changed, 84 insertions(+), 2 deletions(-) diff --git a/be/src/vec/data_types/data_type_array.cpp b/be/src/vec/data_types/data_type_array.cpp index 61fb4c04a5..4a0c1ae049 100644 --- a/be/src/vec/data_types/data_type_array.cpp +++ b/be/src/vec/data_types/data_type_array.cpp @@ -201,15 +201,28 @@ Status DataTypeArray::from_string(ReadBuffer& rb, IColumn* column) const { if (*rb.position() == ']') { break; } - size_t nested_str_len = 1; + size_t nested_str_len = 0; char* temp_char = rb.position() + nested_str_len; while (*(temp_char) != ']' && *(temp_char) != ',' && temp_char != rb.end()) { ++nested_str_len; temp_char = rb.position() + nested_str_len; } - // dispose the case of ["123"] or ['123'] + // dispose the case of [123,,,] + if (nested_str_len == 0) { + if (nested_column.is_nullable()) { + auto& nested_null_col = reinterpret_cast<ColumnNullable&>(nested_column); + nested_null_col.get_nested_column().insert_default(); + nested_null_col.get_null_map_data().push_back(0); + } else { + nested_column.insert_default(); + } + ++size; + continue; + } + ReadBuffer read_buffer(rb.position(), nested_str_len); + // dispose the case of ["123"] or ['123'] auto begin_char = *rb.position(); auto end_char = *(rb.position() + nested_str_len - 1); if (begin_char == end_char && (begin_char == '"' || begin_char == '\'')) { diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_cast_array_function.out b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_array_function.out similarity index 100% rename from regression-test/data/query_p0/sql_functions/array_functions/test_cast_array_function.out rename to regression-test/data/query_p0/sql_functions/cast_function/test_cast_array_function.out diff --git a/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out new file mode 100644 index 0000000000..1eb1418926 --- /dev/null +++ b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_string_to_array.out @@ -0,0 +1,27 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +[1, 2, 3] + +-- !sql -- +['a', 'b', 'c'] + +-- !sql -- +[1.34, 2.001] + +-- !sql -- +[1.34, 2.001] + +-- !sql -- +[2022-09-01] + +-- !sql -- +[1, 2, 3, 0, 0] + +-- !sql -- +['a', 'b', 'c', '', ''] + +-- !sql -- +[1.34, 2.01, 0, 0] + +-- !sql -- +[2022-09-01, 0000-00-00] diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_cast_array_function.groovy b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_function.groovy similarity index 100% rename from regression-test/suites/query_p0/sql_functions/array_functions/test_cast_array_function.groovy rename to regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_function.groovy diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_cast_array_functions_by_literal.groovy b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy similarity index 100% rename from regression-test/suites/query_p0/sql_functions/array_functions/test_cast_array_functions_by_literal.groovy rename to regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy diff --git a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy new file mode 100644 index 0000000000..ab31f54031 --- /dev/null +++ b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_string_to_array.groovy @@ -0,0 +1,42 @@ +// 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_cast_string_to_array") { + sql "set enable_vectorized_engine = true" + sql "ADMIN SET FRONTEND CONFIG ('enable_array_type' = 'true')" + + // cast string to array<int> + qt_sql """ select cast ("[1,2,3]" as array<int>) """ + + // cast string to array<string> + qt_sql """ select cast ("['a','b','c']" as array<string>) """ + + // cast string to array<double> + qt_sql """ select cast ("[1.34,2.001]" as array<double>) """ + + // cast string to array<decimal> + qt_sql """ select cast ("[1.34,2.001]" as array<decimal>) """ + + // cast string to array<date> + qt_sql """ select cast ("[2022-09-01]" as array<date>) """ + + // cast empty value + qt_sql """ select cast ("[1,2,3,,,]" as array<int>) """ + qt_sql """ select cast ("[a,b,c,,,]" as array<string>) """ + qt_sql """ select cast ("[1.34,2.01,,,]" as array<decimal>) """ + qt_sql """ select cast ("[2022-09-01,,]" as array<date>) """ +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org