Skip to content

Commit e19930f

Browse files
authored
fix value parsing recursion issues (#12391)
1 parent 29362cf commit e19930f

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
@@ -422,22 +422,36 @@ class TJsonQuery : public TViewerPipeClient {
422422
return ColumnPrimitiveValueToJsonValue(valueParser);
423423

424424
case NYdb::TTypeParser::ETypeKind::Optional:
425-
valueParser.OpenOptional();
426-
if (valueParser.IsNull()) {
427-
return NJson::JSON_NULL;
428-
}
429-
switch(valueParser.GetKind()) {
430-
case NYdb::TTypeParser::ETypeKind::Primitive:
431-
return ColumnPrimitiveValueToJsonValue(valueParser);
432-
case NYdb::TTypeParser::ETypeKind::Decimal:
433-
return valueParser.GetDecimal().ToString();
434-
default:
435-
return NJson::JSON_UNDEFINED;
425+
{
426+
NJson::TJsonValue jsonOptional;
427+
valueParser.OpenOptional();
428+
if (valueParser.IsNull()) {
429+
jsonOptional = NJson::JSON_NULL;
430+
} else {
431+
switch(valueParser.GetKind()) {
432+
case NYdb::TTypeParser::ETypeKind::Primitive:
433+
jsonOptional = ColumnPrimitiveValueToJsonValue(valueParser);
434+
break;
435+
case NYdb::TTypeParser::ETypeKind::Decimal:
436+
jsonOptional = valueParser.GetDecimal().ToString();
437+
break;
438+
default:
439+
jsonOptional = NJson::JSON_UNDEFINED;
440+
break;
441+
}
442+
}
443+
valueParser.CloseOptional();
444+
return jsonOptional;
436445
}
437446

438447
case NYdb::TTypeParser::ETypeKind::Tagged:
439-
valueParser.OpenTagged();
440-
return ColumnValueToJsonValue(valueParser);
448+
{
449+
NJson::TJsonValue jsonTagged;
450+
valueParser.OpenTagged();
451+
jsonTagged = ColumnValueToJsonValue(valueParser);
452+
valueParser.CloseTagged();
453+
return jsonTagged;
454+
}
441455

442456
case NYdb::TTypeParser::ETypeKind::Pg:
443457
return valueParser.GetPg().Content_;
@@ -453,6 +467,7 @@ class TJsonQuery : public TViewerPipeClient {
453467
while (valueParser.TryNextListItem()) {
454468
jsonList.AppendValue(ColumnValueToJsonValue(valueParser));
455469
}
470+
valueParser.CloseList();
456471
return jsonList;
457472
}
458473

@@ -464,6 +479,7 @@ class TJsonQuery : public TViewerPipeClient {
464479
while (valueParser.TryNextElement()) {
465480
jsonTuple.AppendValue(ColumnValueToJsonValue(valueParser));
466481
}
482+
valueParser.CloseTuple();
467483
return jsonTuple;
468484
}
469485

@@ -475,6 +491,7 @@ class TJsonQuery : public TViewerPipeClient {
475491
while (valueParser.TryNextMember()) {
476492
jsonStruct[valueParser.GetMemberName()] = ColumnValueToJsonValue(valueParser);
477493
}
494+
valueParser.CloseStruct();
478495
return jsonStruct;
479496
}
480497

@@ -485,16 +502,21 @@ class TJsonQuery : public TViewerPipeClient {
485502
valueParser.OpenDict();
486503
while (valueParser.TryNextDictItem()) {
487504
valueParser.DictKey();
488-
TString key = valueParser.GetString();
505+
NJson::TJsonValue jsonDictKey = ColumnValueToJsonValue(valueParser);
489506
valueParser.DictPayload();
490-
jsonDict[key] = ColumnValueToJsonValue(valueParser);
507+
jsonDict[jsonDictKey.GetStringRobust()] = ColumnValueToJsonValue(valueParser);
491508
}
509+
valueParser.CloseDict();
492510
return jsonDict;
493511
}
494512

495513
case NYdb::TTypeParser::ETypeKind::Variant:
496-
valueParser.OpenVariant();
497-
return ColumnValueToJsonValue(valueParser);
514+
{
515+
valueParser.OpenVariant();
516+
NJson::TJsonValue jsonVariant = ColumnValueToJsonValue(valueParser);
517+
valueParser.CloseVariant();
518+
return jsonVariant;
519+
}
498520

499521
case NYdb::TTypeParser::ETypeKind::EmptyList:
500522
return NJson::JSON_ARRAY;

0 commit comments

Comments
 (0)