diff options
author | uzhas <uzhas@ydb.tech> | 2022-09-17 22:12:20 +0300 |
---|---|---|
committer | uzhas <uzhas@ydb.tech> | 2022-09-17 22:12:20 +0300 |
commit | 24496f8d09fc0c6004906f8d99785559f996c873 (patch) | |
tree | e0f549bb163f6d67576198783ad7d651306fcb0b | |
parent | 49726f2627f20969d8e6358fc107bdf139c87f99 (diff) | |
download | ydb-24496f8d09fc0c6004906f8d99785559f996c873.tar.gz |
fix crash when format struct with no fields and empty tuple
-rw-r--r-- | ydb/core/yq/libs/result_formatter/result_formatter.cpp | 15 | ||||
-rw-r--r-- | ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp | 64 |
2 files changed, 68 insertions, 11 deletions
diff --git a/ydb/core/yq/libs/result_formatter/result_formatter.cpp b/ydb/core/yq/libs/result_formatter/result_formatter.cpp index 0d8cca459a6..484584ce4b4 100644 --- a/ydb/core/yq/libs/result_formatter/result_formatter.cpp +++ b/ydb/core/yq/libs/result_formatter/result_formatter.cpp @@ -95,7 +95,7 @@ NKikimr::NMiniKQL::TType* MakeStructType( const TVector<std::pair<TString, NKikimr::NMiniKQL::TType*>>& items, NKikimr::NMiniKQL::TTypeEnvironment& env) { - return TStructType::Create(&items[0], items.size(), env); + return TStructType::Create(items.data(), items.size(), env); } const NYql::TTypeAnnotationNode* MakeTupleType( @@ -109,7 +109,7 @@ NKikimr::NMiniKQL::TType* MakeTupleType( const TVector<NKikimr::NMiniKQL::TType*>& items, NKikimr::NMiniKQL::TTypeEnvironment& env) { - return TTupleType::Create(items.size(), &items[0], env); + return TTupleType::Create(items.size(), items.data(), env); } const NYql::TTypeAnnotationNode* MakeDictType( @@ -225,15 +225,11 @@ TType MakeType(NYdb::TTypeParser& parser, TContext& env) auto colName = parser.GetMemberName(); node = MakeType<TType>(parser, env); if (!node) { - break; + return nullptr; } items.push_back({colName, node}); } parser.CloseStruct(); - if (!node) { - return nullptr; - } - return MakeStructType(items, env); } case NYdb::TTypeParser::ETypeKind::Tuple: { @@ -243,13 +239,10 @@ TType MakeType(NYdb::TTypeParser& parser, TContext& env) while (parser.TryNextElement()) { node = MakeType<TType>(parser, env); if (!node) { - break; + return nullptr; } items.push_back(node); } - if (!node) { - return nullptr; - } parser.CloseTuple(); return MakeTupleType(items, env); } diff --git a/ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp b/ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp index 6d269408058..298b2ddd6dd 100644 --- a/ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp +++ b/ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp @@ -200,6 +200,46 @@ Y_UNIT_TEST_SUITE(ResultFormatter) { } } + Y_UNIT_TEST(StructWithNoFields) { + Ydb::ResultSet rs; + { + auto& column = *rs.add_columns(); + column.set_name("column0"); + column.mutable_type()->mutable_struct_type(); + } + { + auto& value = *rs.add_rows(); + value.add_items(); + } + + { + NJson::TJsonValue root; + FormatResultSet(root, rs); + + TStringStream stream; + NJson::WriteJson(&stream, &root); + + //Cerr << stream.Str() << Endl; + TString expected = R"___({"data":[{"column0":[]}],"columns":[{"name":"column0","type":["StructType",[]]}]})___"; + + UNIT_ASSERT_VALUES_EQUAL(stream.Str(), expected); + } + + // pretty format + { + NJson::TJsonValue root; + FormatResultSet(root, rs, true, true); + + TStringStream stream; + NJson::WriteJson(&stream, &root); + + //Cerr << stream.Str() << Endl; + TString expected = R"___({"data":[{"column0":{}}],"columns":[{"name":"column0","type":"Struct<>"}]})___"; + + UNIT_ASSERT_VALUES_EQUAL(stream.Str(), expected); + } + } + Y_UNIT_TEST(StructTypeNameAsString) { Ydb::ResultSet rs; { @@ -358,6 +398,30 @@ Y_UNIT_TEST_SUITE(ResultFormatter) { UNIT_ASSERT_VALUES_EQUAL(stream.Str(), expected); } + Y_UNIT_TEST(EmptyTuple) { + Ydb::ResultSet rs; + { + auto& column = *rs.add_columns(); + column.set_name("column0"); + column.mutable_type()->mutable_tuple_type(); + } + { + auto& value = *rs.add_rows(); + value.add_items(); + } + + NJson::TJsonValue root; + FormatResultSet(root, rs); + + TStringStream stream; + NJson::WriteJson(&stream, &root); + + //Cerr << stream.Str() << Endl; + TString expected = R"___({"data":[{"column0":[]}],"columns":[{"name":"column0","type":["TupleType",[]]}]})___"; + + UNIT_ASSERT_VALUES_EQUAL(stream.Str(), expected); + } + Y_UNIT_TEST(Dict) { Ydb::ResultSet rs; { |