diff --git a/be/src/vec/json/parse2column.cpp b/be/src/vec/json/parse2column.cpp index 0f61e24dad7c4b..a154ad14333363 100644 --- a/be/src/vec/json/parse2column.cpp +++ b/be/src/vec/json/parse2column.cpp @@ -163,7 +163,11 @@ void parse_json_to_variant(IColumn& column, const char* src, size_t length, throw doris::Exception(ErrorCode::INVALID_ARGUMENT, "Failed to find sub column {}", paths[i].get_path()); } - DCHECK_EQ(subcolumn->size(), old_num_rows); + if (subcolumn->size() != old_num_rows) { + throw doris::Exception(ErrorCode::INVALID_ARGUMENT, + "subcolumn {} size missmatched, may contains duplicated entry", + paths[i].get_path()); + } subcolumn->insert(std::move(values[i]), std::move(field_info)); } // /// Insert default values to missed subcolumns. diff --git a/be/src/vec/json/path_in_data.cpp b/be/src/vec/json/path_in_data.cpp index 4b3692f4776878..30c9ff217688ab 100644 --- a/be/src/vec/json/path_in_data.cpp +++ b/be/src/vec/json/path_in_data.cpp @@ -188,13 +188,11 @@ PathInDataBuilder& PathInDataBuilder::append(std::string_view key, bool is_array if (parts.empty()) { current_anonymous_array_level += is_array; } - if (!key.empty()) { - if (!parts.empty()) { - parts.back().is_nested = is_array; - } - parts.emplace_back(key, false, current_anonymous_array_level); - current_anonymous_array_level = 0; + if (!parts.empty()) { + parts.back().is_nested = is_array; } + parts.emplace_back(key, false, current_anonymous_array_level); + current_anonymous_array_level = 0; return *this; } PathInDataBuilder& PathInDataBuilder::append(const PathInData::Parts& path, bool is_array) { diff --git a/regression-test/data/variant_p0/column_name.out b/regression-test/data/variant_p0/column_name.out index 2942c8d53bc9b1..7e1f23d4ac8b56 100644 --- a/regression-test/data/variant_p0/column_name.out +++ b/regression-test/data/variant_p0/column_name.out @@ -3,7 +3,7 @@ 中文 unicode -- !sql -- -"" + -- !sql -- \N @@ -32,3 +32,18 @@ UPPER CASE lower case -- !sql -- 1 {"tag_key1":123456} +-- !sql -- +\N +\N +\N +\N +\N +"" +1234566 +16 +8888888 +"UPPER CASE" +"dkdkdkdkdkd" +"ooaoaaaaaaa" +"xmxxmmmmmm" + diff --git a/regression-test/suites/variant_p0/column_name.groovy b/regression-test/suites/variant_p0/column_name.groovy index be0026e9c940ea..26520aafa502d5 100644 --- a/regression-test/suites/variant_p0/column_name.groovy +++ b/regression-test/suites/variant_p0/column_name.groovy @@ -35,7 +35,7 @@ suite("regression_test_variant_column_name", "variant_type"){ // sql """insert into ${table_name} values (2, '{}')""" sql "truncate table ${table_name}" sql """insert into ${table_name} values (3, '{"": ""}')""" - qt_sql """select v[''] from ${table_name} order by k""" + qt_sql """select cast(v[''] as text) from ${table_name} order by k""" sql """insert into ${table_name} values (4, '{"!@#^&*()": "11111"}')""" qt_sql """select cast(v["!@#^&*()"] as string) from ${table_name} order by k""" sql """insert into ${table_name} values (5, '{"123": "456", "789": "012"}')""" @@ -50,4 +50,25 @@ suite("regression_test_variant_column_name", "variant_type"){ qt_sql "select * from var_column_name where tags['tag_key1'] is not null and cast(tags['tag_key1' ] as text) = '123456' order by k desc limit 1;" qt_sql "select * from var_column_name where Tags['tag_key1'] is not null and cast(tags['tag_key1' ] as text) = '123456' order by k desc limit 1;" qt_sql "select * from var_column_name where Tags['tag_key1'] is not null and cast(Tags['tag_key1' ] as text) = '123456' order by k desc limit 1;" + + // empty key + sql """insert into var_column_name values (7, '{"": "UPPER CASE"}')""" + sql """ + insert into var_column_name values (7, '{"":16,"OpenCapStatus":0,"AccStatus":1,"AccTimeSum":481,"LowVoltage":0,"TowedStatus":0,"EncryptLng":117.23572361077638,"deviceId":"A1100614808888"}') + """ + sql """insert into var_column_name values (7, '{"": ""}')""" + sql """insert into var_column_name values (7, '{"": "dkdkdkdkdkd"}')""" + sql """insert into var_column_name values (7, '{"": "xmxxmmmmmm"}')""" + sql """insert into var_column_name values (7, '{"": "ooaoaaaaaaa"}')""" + sql """insert into var_column_name values (7, '{"": 1234566}')""" + sql """insert into var_column_name values (7, '{"": 8888888}')""" + + qt_sql "select Tags[''] from var_column_name order by cast(Tags[''] as string)" + + try { + sql """insert into var_column_name values (7, '{"": "UPPER CASE", "": "lower case"}')""" + } catch(Exception ex) { + logger.info("""INSERT INTO ${table_name} failed: """ + ex) + assertTrue(ex.toString().contains("may contains duplicated entry")); + } } \ No newline at end of file