aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruzhas <uzhas@ydb.tech>2022-09-17 22:12:20 +0300
committeruzhas <uzhas@ydb.tech>2022-09-17 22:12:20 +0300
commit24496f8d09fc0c6004906f8d99785559f996c873 (patch)
treee0f549bb163f6d67576198783ad7d651306fcb0b
parent49726f2627f20969d8e6358fc107bdf139c87f99 (diff)
downloadydb-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.cpp15
-rw-r--r--ydb/core/yq/libs/result_formatter/result_formatter_ut.cpp64
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;
{