Skip to content

Commit 7054b5d

Browse files
authored
Fix YqlParser: unitialized variables and ignoring BuildType return value (#29184)
1 parent f6721f8 commit 7054b5d

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

ydb/public/lib/ydb_cli/common/yql_parser/yql_parser.cpp

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ class TYqlTypeParser {
4444

4545
private:
4646
struct TypeNode {
47-
TTypeParser::ETypeKind TypeKind;
47+
std::optional<TTypeParser::ETypeKind> TypeKind = std::nullopt;
4848
std::vector<TypeNode> Children;
4949

5050
// For primitive type
51-
EPrimitiveType PrimitiveType;
51+
std::optional<EPrimitiveType> PrimitiveType = std::nullopt;
5252

5353
// For struct type
5454
TString Name;
@@ -218,14 +218,6 @@ class TYqlTypeParser {
218218
node.PrimitiveType = EPrimitiveType::JsonDocument;
219219
} else if (content == "dynumber") {
220220
node.PrimitiveType = EPrimitiveType::DyNumber;
221-
} else if (content == "emptylist") {
222-
node.TypeKind = TTypeParser::ETypeKind::EmptyList;
223-
} else if (content == "emptydict") {
224-
node.TypeKind = TTypeParser::ETypeKind::EmptyDict;
225-
} else if (content == "void") {
226-
node.TypeKind = TTypeParser::ETypeKind::Void;
227-
} else if (content == "null") {
228-
node.TypeKind = TTypeParser::ETypeKind::Null;
229221
} else {
230222
return std::nullopt;
231223
}
@@ -273,39 +265,58 @@ class TYqlTypeParser {
273265
}
274266

275267
bool BuildType(const TypeNode& node, TTypeBuilder& builder) {
276-
if (node.TypeKind == TTypeParser::ETypeKind::Optional) {
268+
if (!node.TypeKind.has_value()) {
269+
return false;
270+
}
271+
272+
if (*node.TypeKind == TTypeParser::ETypeKind::Optional) {
277273
builder.BeginOptional();
278-
BuildType(node.Children[0], builder);
274+
if (!BuildType(node.Children[0], builder)) {
275+
return false;
276+
}
279277
builder.EndOptional();
280-
} else if (node.TypeKind == TTypeParser::ETypeKind::List) {
278+
} else if (*node.TypeKind == TTypeParser::ETypeKind::List) {
281279
builder.BeginList();
282-
BuildType(node.Children[0], builder);
280+
if (!BuildType(node.Children[0], builder)) {
281+
return false;
282+
}
283283
builder.EndList();
284-
} else if (node.TypeKind == TTypeParser::ETypeKind::Struct) {
284+
} else if (*node.TypeKind == TTypeParser::ETypeKind::Struct) {
285285
builder.BeginStruct();
286286
for (const auto& field : node.Children) {
287287
builder.AddMember(field.Name);
288-
BuildType(field, builder);
288+
if (!BuildType(field, builder)) {
289+
return false;
290+
}
289291
}
290292
builder.EndStruct();
291-
} else if (node.TypeKind == TTypeParser::ETypeKind::Tuple) {
293+
} else if (*node.TypeKind == TTypeParser::ETypeKind::Tuple) {
292294
builder.BeginTuple();
293295
for (const auto& element : node.Children) {
294296
builder.AddElement();
295-
BuildType(element, builder);
297+
if (!BuildType(element, builder)) {
298+
return false;
299+
}
296300
}
297301
builder.EndTuple();
298-
} else if (node.TypeKind == TTypeParser::ETypeKind::Dict) {
302+
} else if (*node.TypeKind == TTypeParser::ETypeKind::Dict) {
299303
builder.BeginDict();
300304
builder.DictKey();
301-
BuildType(node.Children[0], builder);
305+
if (!BuildType(node.Children[0], builder)) {
306+
return false;
307+
}
302308
builder.DictPayload();
303-
BuildType(node.Children[1], builder);
309+
if (!BuildType(node.Children[1], builder)) {
310+
return false;
311+
}
304312
builder.EndDict();
305-
} else if (node.TypeKind == TTypeParser::ETypeKind::Decimal) {
313+
} else if (*node.TypeKind == TTypeParser::ETypeKind::Decimal) {
306314
builder.Decimal(TDecimalType(node.precision, node.scale));
307-
} else if (node.TypeKind == TTypeParser::ETypeKind::Primitive) {
308-
builder.Primitive(node.PrimitiveType);
315+
} else if (*node.TypeKind == TTypeParser::ETypeKind::Primitive) {
316+
if (!node.PrimitiveType.has_value()) {
317+
return false;
318+
}
319+
builder.Primitive(*node.PrimitiveType);
309320
} else {
310321
return false;
311322
}

0 commit comments

Comments
 (0)