@@ -398,13 +398,14 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
398398 if (ev->Get ()->Record .GetRef ().GetYdbStatus () == Ydb::StatusIds::SUCCESS) {
399399 QueryResponse.Set (std::move (ev));
400400 MakeOkReply (jsonResponse, QueryResponse->Record .GetRef ());
401+ if (Schema == ESchemaType::Classic && Stats.empty () && (Action.empty () || Action == " execute" )) {
402+ jsonResponse = std::move (jsonResponse[" result" ]);
403+ }
401404 } else {
402405 QueryResponse.Error (" QueryError" );
403- MakeErrorReply (jsonResponse, ev->Get ()->Record .GetRef ().MutableResponse ()->MutableQueryIssues ());
404- }
405-
406- if (Schema == ESchemaType::Classic && Stats.empty () && (Action.empty () || Action == " execute" )) {
407- jsonResponse = std::move (jsonResponse[" result" ]);
406+ NYql::TIssues issues;
407+ NYql::IssuesFromMessage (ev->Get ()->Record .GetRef ().GetResponse ().GetQueryIssues (), issues);
408+ MakeErrorReply (jsonResponse, NYdb::TStatus (NYdb::EStatus (ev->Get ()->Record .GetRef ().GetYdbStatus ()), std::move (issues)));
408409 }
409410
410411 TStringStream stream;
@@ -421,7 +422,9 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
421422 auto & record (ev->Get ()->Record );
422423 NJson::TJsonValue jsonResponse;
423424 if (record.IssuesSize () > 0 ) {
424- MakeErrorReply (jsonResponse, record.MutableIssues ());
425+ NYql::TIssues issues;
426+ NYql::IssuesFromMessage (record.GetIssues (), issues);
427+ MakeErrorReply (jsonResponse, NYdb::TStatus (NYdb::EStatus (record.GetStatusCode ()), std::move (issues)));
425428 }
426429
427430 TStringStream stream;
@@ -472,26 +475,11 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
472475 }
473476
474477private:
475- void MakeErrorReply (NJson::TJsonValue& jsonResponse, google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage>* protoIssues) {
476- NJson::TJsonValue& jsonIssues = jsonResponse[" issues" ];
477-
478- // find first deepest error
479- std::stable_sort (protoIssues->begin (), protoIssues->end (), [](const Ydb::Issue::IssueMessage& a, const Ydb::Issue::IssueMessage& b) -> bool {
480- return a.severity () < b.severity ();
481- });
482- while (protoIssues->size () > 0 && (*protoIssues)[0 ].issuesSize () > 0 ) {
483- protoIssues = (*protoIssues)[0 ].mutable_issues ();
484- }
478+ void MakeErrorReply (NJson::TJsonValue& jsonResponse, const NYdb::TStatus& status) {
485479 TString message;
486- if (protoIssues->size () > 0 ) {
487- const Ydb::Issue::IssueMessage& issue = (*protoIssues)[0 ];
488- NProtobufJson::Proto2Json (issue, jsonResponse[" error" ]);
489- message = issue.message ();
490- }
491- for (const auto & queryIssue : *protoIssues) {
492- NJson::TJsonValue& issue = jsonIssues.AppendValue ({});
493- NProtobufJson::Proto2Json (queryIssue, issue);
494- }
480+
481+ NViewer::MakeErrorReply (jsonResponse, message, status);
482+
495483 if (Span) {
496484 Span.EndError (" Error" );
497485 }
@@ -513,11 +501,9 @@ class TJsonQuery : public TViewerPipeClient<TJsonQuery> {
513501 }
514502 }
515503 catch (const std::exception& ex) {
516- google::protobuf::RepeatedPtrField<Ydb::Issue::IssueMessage> protoIssues;
517- Ydb::Issue::IssueMessage* issue = protoIssues.Add ();
518- issue->set_message (TStringBuilder () << " Convert error: " << ex.what ());
519- issue->set_severity (NYql::TSeverityIds::S_ERROR);
520- MakeErrorReply (jsonResponse, &protoIssues);
504+ NYql::TIssues issues;
505+ issues.AddIssue (TStringBuilder () << " Convert error: " << ex.what ());
506+ MakeErrorReply (jsonResponse, NYdb::TStatus (NYdb::EStatus::BAD_REQUEST, std::move (issues)));
521507 return ;
522508 }
523509 }
0 commit comments