Skip to content

Commit e3dd773

Browse files
fix value parsing recursion issues (#12391) (#12467)
Co-authored-by: Alexey Efimov <xeno@ydb.tech>
1 parent 5722519 commit e3dd773

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

ydb/core/viewer/viewer_query.h

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -407,22 +407,36 @@ class TJsonQuery : public TViewerPipeClient {
407407
return ColumnPrimitiveValueToJsonValue(valueParser);
408408

409409
case NYdb::TTypeParser::ETypeKind::Optional:
410-
valueParser.OpenOptional();
411-
if (valueParser.IsNull()) {
412-
return NJson::JSON_NULL;
413-
}
414-
switch(valueParser.GetKind()) {
415-
case NYdb::TTypeParser::ETypeKind::Primitive:
416-
return ColumnPrimitiveValueToJsonValue(valueParser);
417-
case NYdb::TTypeParser::ETypeKind::Decimal:
418-
return valueParser.GetDecimal().ToString();
419-
default:
420-
return NJson::JSON_UNDEFINED;
410+
{
411+
NJson::TJsonValue jsonOptional;
412+
valueParser.OpenOptional();
413+
if (valueParser.IsNull()) {
414+
jsonOptional = NJson::JSON_NULL;
415+
} else {
416+
switch(valueParser.GetKind()) {
417+
case NYdb::TTypeParser::ETypeKind::Primitive:
418+
jsonOptional = ColumnPrimitiveValueToJsonValue(valueParser);
419+
break;
420+
case NYdb::TTypeParser::ETypeKind::Decimal:
421+
jsonOptional = valueParser.GetDecimal().ToString();
422+
break;
423+
default:
424+
jsonOptional = NJson::JSON_UNDEFINED;
425+
break;
426+
}
427+
}
428+
valueParser.CloseOptional();
429+
return jsonOptional;
421430
}
422431

423432
case NYdb::TTypeParser::ETypeKind::Tagged:
424-
valueParser.OpenTagged();
425-
return ColumnValueToJsonValue(valueParser);
433+
{
434+
NJson::TJsonValue jsonTagged;
435+
valueParser.OpenTagged();
436+
jsonTagged = ColumnValueToJsonValue(valueParser);
437+
valueParser.CloseTagged();
438+
return jsonTagged;
439+
}
426440

427441
case NYdb::TTypeParser::ETypeKind::Pg:
428442
return valueParser.GetPg().Content_;
@@ -438,6 +452,7 @@ class TJsonQuery : public TViewerPipeClient {
438452
while (valueParser.TryNextListItem()) {
439453
jsonList.AppendValue(ColumnValueToJsonValue(valueParser));
440454
}
455+
valueParser.CloseList();
441456
return jsonList;
442457
}
443458

@@ -449,6 +464,7 @@ class TJsonQuery : public TViewerPipeClient {
449464
while (valueParser.TryNextElement()) {
450465
jsonTuple.AppendValue(ColumnValueToJsonValue(valueParser));
451466
}
467+
valueParser.CloseTuple();
452468
return jsonTuple;
453469
}
454470

@@ -460,6 +476,7 @@ class TJsonQuery : public TViewerPipeClient {
460476
while (valueParser.TryNextMember()) {
461477
jsonStruct[valueParser.GetMemberName()] = ColumnValueToJsonValue(valueParser);
462478
}
479+
valueParser.CloseStruct();
463480
return jsonStruct;
464481
}
465482

@@ -470,16 +487,21 @@ class TJsonQuery : public TViewerPipeClient {
470487
valueParser.OpenDict();
471488
while (valueParser.TryNextDictItem()) {
472489
valueParser.DictKey();
473-
TString key = valueParser.GetString();
490+
NJson::TJsonValue jsonDictKey = ColumnValueToJsonValue(valueParser);
474491
valueParser.DictPayload();
475-
jsonDict[key] = ColumnValueToJsonValue(valueParser);
492+
jsonDict[jsonDictKey.GetStringRobust()] = ColumnValueToJsonValue(valueParser);
476493
}
494+
valueParser.CloseDict();
477495
return jsonDict;
478496
}
479497

480498
case NYdb::TTypeParser::ETypeKind::Variant:
481-
valueParser.OpenVariant();
482-
return ColumnValueToJsonValue(valueParser);
499+
{
500+
valueParser.OpenVariant();
501+
NJson::TJsonValue jsonVariant = ColumnValueToJsonValue(valueParser);
502+
valueParser.CloseVariant();
503+
return jsonVariant;
504+
}
483505

484506
case NYdb::TTypeParser::ETypeKind::EmptyList:
485507
return NJson::JSON_ARRAY;

0 commit comments

Comments
 (0)