This is an automated email from the ASF dual-hosted git repository. yiguolei 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 36a5e0a2a9 [bugfix](array) fix element revert on error in DataTypeArray::from_string (#16434) 36a5e0a2a9 is described below commit 36a5e0a2a9212a1a7356c81071b38408e17dad11 Author: Kang <kxiao.ti...@gmail.com> AuthorDate: Mon Feb 6 18:27:36 2023 +0800 [bugfix](array) fix element revert on error in DataTypeArray::from_string (#16434) * fix array from_string element revert on error * add testcase --- be/src/vec/data_types/data_type_array.cpp | 6 +- .../load/insert/test_array_insert_into_select.out | 13 +++++ .../insert/test_array_insert_into_select.groovy | 65 ++++++++++++++++++++++ 3 files changed, 82 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 6827cb3779..97af5ac720 100644 --- a/be/src/vec/data_types/data_type_array.cpp +++ b/be/src/vec/data_types/data_type_array.cpp @@ -267,6 +267,8 @@ Status DataTypeArray::from_string(ReadBuffer& rb, IColumn* column) const { StringRef element(rb.position(), rb.count()); bool has_quota = false; if (!next_element_from_string(rb, element, has_quota)) { + // we should do array element column revert if error + nested_column.pop_back(element_num); return Status::InvalidArgument("Cannot read array element from text '{}'", element.to_string()); } @@ -294,8 +296,8 @@ Status DataTypeArray::from_string(ReadBuffer& rb, IColumn* column) const { ReadBuffer read_buffer(const_cast<char*>(element.data), element.size); auto st = nested->from_string(read_buffer, &nested_column); if (!st.ok()) { - // we should do revert if error - array_column->pop_back(element_num); + // we should do array element column revert if error + nested_column.pop_back(element_num); return st; } ++element_num; diff --git a/regression-test/data/load/insert/test_array_insert_into_select.out b/regression-test/data/load/insert/test_array_insert_into_select.out new file mode 100644 index 0000000000..2dcf990314 --- /dev/null +++ b/regression-test/data/load/insert/test_array_insert_into_select.out @@ -0,0 +1,13 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_string -- +0 [{"a":"1","b":"2","c":"3",}, {"a":"1","b":"2"}] +1 ['{"a":"1","b":"2","c":"3",}', '{"a":"1","b":"2"}'] +2 [{"a":"1","b":"2"}] +3 [] + +-- !select_array -- +0 \N +1 ['{"a":"1","b":"2","c":"3",}', '{"a":"1","b":"2"}'] +2 \N +3 [] + diff --git a/regression-test/suites/load/insert/test_array_insert_into_select.groovy b/regression-test/suites/load/insert/test_array_insert_into_select.groovy new file mode 100644 index 0000000000..f171ae3220 --- /dev/null +++ b/regression-test/suites/load/insert/test_array_insert_into_select.groovy @@ -0,0 +1,65 @@ +// 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_array_insert_into_select", "load") { + // create table with string + sql "DROP TABLE IF EXISTS tstring" + sql """ + CREATE TABLE `tstring` ( + `id` INT, + `data` STRING + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1"); + """ + + // insert invalid row 0 + sql """INSERT INTO tstring VALUES (0, '[{"a":"1","b":"2","c":"3",}, {"a":"1","b":"2"}]')""" + // insert valid row 1 + sql """INSERT INTO tstring VALUES (1, '[\\'{"a":"1","b":"2","c":"3",}\\', \\'{"a":"1","b":"2"}\\']')""" + // insert invalid row 2 + sql """INSERT INTO tstring VALUES (2, '[{"a":"1","b":"2"}]')""" + // insert valid row 3 + sql """INSERT INTO tstring VALUES (3, '[]')""" + + // check data in tstring + qt_select_string "SELECT * FROM tstring ORDER BY id" + + + // create table with array + sql "DROP TABLE IF EXISTS tarray" + sql """ + CREATE TABLE `tarray` ( + `id` INT, + `data` ARRAY<STRING> + ) ENGINE=OLAP + DUPLICATE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1"); + """ + + // insert rows to tarray + sql "INSERT INTO tarray SELECT * FROM tstring" + + // check data in tarray + qt_select_array "SELECT * FROM tarray ORDER BY id" +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org