diff options
author | galaxycrab <UgnineSirdis@ydb.tech> | 2022-10-31 13:50:00 +0300 |
---|---|---|
committer | galaxycrab <UgnineSirdis@ydb.tech> | 2022-10-31 13:50:00 +0300 |
commit | f7d9221df266d13b4a7036d90d4fe374c7b3e056 (patch) | |
tree | ab29ccd7db373b54b85d6a750ee21909523bcdfe | |
parent | 1a8010a735a218f84480e8ef1e6ffd5a45033c94 (diff) | |
download | ydb-f7d9221df266d13b4a7036d90d4fe374c7b3e056.tar.gz |
Fix crash caused by writing nonutf-8 to issue message
В issue поле Message является публичным, поэтому легко записать в него всё что угодно. Хотя кострукторы TIssue делают эскейпинг строк. В S3 source был парсинг сжатых бинарных данных как json'а (юзер забыл указать в биндинге, что файл сжат с помощью gzip) и парсер (clickhouse) выдал в качестве ошибки кусочек этих данных, который затем пошёл в Message (напрямую, не через конструктор, который эскейпит их). В результате не-utf-8 строка была записана в протобуф и передана в акторном сообщении на другую ноду. Другая нода упала в верифайке на распаковке сообщения: протобуф проверяет, что поле типа string должно содержать строку в utf-8.
Сделал поле Message private и в методе SetMessage() вызвал эскейпинг строки, такой же, какой делается в конструкторе.
45 files changed, 195 insertions, 134 deletions
diff --git a/ydb/core/base/kikimr_issue.h b/ydb/core/base/kikimr_issue.h index fd7e232d2c..843f2a65a1 100644 --- a/ydb/core/base/kikimr_issue.h +++ b/ydb/core/base/kikimr_issue.h @@ -35,7 +35,7 @@ inline NYql::TIssue MakeIssue(NKikimrIssues::TIssuesIds::EIssueCode id, const TS NYql::TIssue issue; SetIssueCode(id, issue); - issue.Message = message; + issue.SetMessage(message); return issue; } diff --git a/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp b/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp index c8da0731a9..c56e7501d7 100644 --- a/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp +++ b/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp @@ -320,7 +320,7 @@ Y_UNIT_TEST_SUITE(TTestYqlToMiniKQLCompile) { TConvertResult result; UNIT_ASSERT(!TryProgramText2Bin(programText, services, result)); UNIT_ASSERT(!result.Errors.Empty()); - UNIT_ASSERT_NO_DIFF(result.Errors.begin()->Message, "At function: SelectRange"); + UNIT_ASSERT_NO_DIFF(result.Errors.begin()->GetMessage(), "At function: SelectRange"); } Y_UNIT_TEST(Extract) { diff --git a/ydb/core/kqp/provider/yql_kikimr_provider.cpp b/ydb/core/kqp/provider/yql_kikimr_provider.cpp index 68a8dcecb5..a60d91fef7 100644 --- a/ydb/core/kqp/provider/yql_kikimr_provider.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_provider.cpp @@ -642,8 +642,8 @@ bool AddDmlIssue(const TIssue& issue, bool strictDml, TExprContext& ctx) { if (strictDml) { TIssue newIssue; newIssue.SetCode(issue.GetCode(), ESeverity::TSeverityIds_ESeverityId_S_ERROR); - newIssue.Message = "Detected violation of logical DML constraints. YDB transactions don't see their own" - " changes, make sure you perform all table reads before any modifications."; + newIssue.SetMessage("Detected violation of logical DML constraints. YDB transactions don't see their own" + " changes, make sure you perform all table reads before any modifications."); newIssue.AddSubIssue(new TIssue(issue)); diff --git a/ydb/core/kqp/ut/kqp_indexes_multishard_ut.cpp b/ydb/core/kqp/ut/kqp_indexes_multishard_ut.cpp index fe2436bfac..4a026cadea 100644 --- a/ydb/core/kqp/ut/kqp_indexes_multishard_ut.cpp +++ b/ydb/core/kqp/ut/kqp_indexes_multishard_ut.cpp @@ -254,7 +254,7 @@ Y_UNIT_TEST_SUITE(KqpMultishardIndex) { UNIT_ASSERT_C(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_WRONG_INDEX_USAGE, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Given predicate is not suitable for used index: index"); + return issue.GetMessage().Contains("Given predicate is not suitable for used index: index"); }), result.GetIssues().ToString()); UNIT_ASSERT(result.IsSuccess()); @@ -270,7 +270,7 @@ Y_UNIT_TEST_SUITE(KqpMultishardIndex) { UNIT_ASSERT_C(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_WRONG_INDEX_USAGE, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Given predicate is not suitable for used index: index"); + return issue.GetMessage().Contains("Given predicate is not suitable for used index: index"); }), result.GetIssues().ToString()); UNIT_ASSERT(result.IsSuccess()); UNIT_ASSERT_VALUES_EQUAL(NYdb::FormatResultSetYson(result.GetResultSet(0)), "[[[2000000000u]]]"); diff --git a/ydb/core/kqp/ut/kqp_limits_ut.cpp b/ydb/core/kqp/ut/kqp_limits_ut.cpp index 75839354bb..b1905eb042 100644 --- a/ydb/core/kqp/ut/kqp_limits_ut.cpp +++ b/ydb/core/kqp/ut/kqp_limits_ut.cpp @@ -258,7 +258,7 @@ Y_UNIT_TEST_SUITE(KqpLimits) { UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::BAD_REQUEST); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("exceeds limit"); + return issue.GetMessage().Contains("exceeds limit"); })); } @@ -283,7 +283,7 @@ Y_UNIT_TEST_SUITE(KqpLimits) { UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("larger than the allowed threshold"); + return issue.GetMessage().Contains("larger than the allowed threshold"); })); } @@ -380,7 +380,7 @@ Y_UNIT_TEST_SUITE(KqpLimits) { UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::PRECONDITION_FAILED); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("Transaction total read size"); + return issue.GetMessage().Contains("Transaction total read size"); })); result = session.ExecuteDataQuery(Q_(R"( @@ -415,7 +415,7 @@ Y_UNIT_TEST_SUITE(KqpLimits) { UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::PRECONDITION_FAILED); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("Memory limit exceeded"); + return issue.GetMessage().Contains("Memory limit exceeded"); })); } diff --git a/ydb/core/kqp/ut/kqp_locks_ut.cpp b/ydb/core/kqp/ut/kqp_locks_ut.cpp index 62b0b94ca3..b4b22cdbfb 100644 --- a/ydb/core/kqp/ut/kqp_locks_ut.cpp +++ b/ydb/core/kqp/ut/kqp_locks_ut.cpp @@ -39,7 +39,7 @@ Y_UNIT_TEST_SUITE(KqpLocks) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_LOCKS_INVALIDATED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("/Root/Test"); + return issue.GetMessage().Contains("/Root/Test"); })); result = session2.ExecuteDataQuery(Q_(R"( @@ -78,7 +78,7 @@ Y_UNIT_TEST_SUITE(KqpLocks) { commitResult.GetIssues().PrintTo(Cerr); UNIT_ASSERT(HasIssue(commitResult.GetIssues(), NYql::TIssuesIds::KIKIMR_LOCKS_INVALIDATED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("/Root/Test"); + return issue.GetMessage().Contains("/Root/Test"); })); result = session2.ExecuteDataQuery(Q_(R"( @@ -148,7 +148,7 @@ Y_UNIT_TEST_SUITE(KqpLocks) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_LOCKS_INVALIDATED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("/Root/Test"); + return issue.GetMessage().Contains("/Root/Test"); })); result = session1.ExecuteDataQuery(Q1_(R"( @@ -193,7 +193,7 @@ Y_UNIT_TEST_SUITE(KqpLocks) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_LOCKS_INVALIDATED, [] (const NYql::TIssue& issue) { - return issue.Message.Contains("/Root/Test"); + return issue.GetMessage().Contains("/Root/Test"); })); result = session1.ExecuteDataQuery(Q1_(R"( diff --git a/ydb/core/kqp/ut/kqp_mvcc_ut.cpp b/ydb/core/kqp/ut/kqp_mvcc_ut.cpp index 3dc16b8e44..365d1ac69f 100644 --- a/ydb/core/kqp/ut/kqp_mvcc_ut.cpp +++ b/ydb/core/kqp/ut/kqp_mvcc_ut.cpp @@ -52,7 +52,7 @@ Y_UNIT_TEST_SUITE(KqpSnapshotRead) { UNIT_ASSERT_C(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue){ - return issue.Message.Contains("stale snapshot"); + return issue.GetMessage().Contains("stale snapshot"); }), result.GetIssues().ToString()); caught = true; diff --git a/ydb/core/kqp/ut/kqp_ne_effects_ut.cpp b/ydb/core/kqp/ut/kqp_ne_effects_ut.cpp index 5ceb914997..b8dca5c860 100644 --- a/ydb/core/kqp/ut/kqp_ne_effects_ut.cpp +++ b/ydb/core/kqp/ut/kqp_ne_effects_ut.cpp @@ -42,7 +42,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Duplicated keys found."); + return issue.GetMessage().Contains("Duplicated keys found."); })); result = session.ExecuteDataQuery(R"( @@ -64,7 +64,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT_C(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Conflict with existing key."); + return issue.GetMessage().Contains("Conflict with existing key."); }), result.GetIssues().ToString()); result = session.ExecuteDataQuery(R"( @@ -145,7 +145,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx(), std::move(params)).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Duplicated keys found."); + return issue.GetMessage().Contains("Duplicated keys found."); })); result = session.ExecuteDataQuery(R"( @@ -184,7 +184,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx(), std::move(params)).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Conflict with existing key."); + return issue.GetMessage().Contains("Conflict with existing key."); })); result = session.ExecuteDataQuery(R"( @@ -261,7 +261,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Duplicated keys found."); + return issue.GetMessage().Contains("Duplicated keys found."); })); result = session.ExecuteDataQuery(R"( @@ -300,7 +300,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngineEffects) { )", TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::PRECONDITION_FAILED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_CONSTRAINT_VIOLATION, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Conflict with existing key."); + return issue.GetMessage().Contains("Conflict with existing key."); })); result = session.ExecuteDataQuery(R"( diff --git a/ydb/core/kqp/ut/kqp_ne_inplace_update_ut.cpp b/ydb/core/kqp/ut/kqp_ne_inplace_update_ut.cpp index fb652cd3dc..bf3c944cd3 100644 --- a/ydb/core/kqp/ut/kqp_ne_inplace_update_ut.cpp +++ b/ydb/core/kqp/ut/kqp_ne_inplace_update_ut.cpp @@ -392,7 +392,7 @@ Y_UNIT_TEST_TWIN(BigRow, EnableInplaceUpdate) { if constexpr (EnableInplaceUpdate) { UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::BAD_REQUEST); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("READ_SIZE_EXECEEDED"); + return issue.GetMessage().Contains("READ_SIZE_EXECEEDED"); })); } else { UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); diff --git a/ydb/core/kqp/ut/kqp_query_ut.cpp b/ydb/core/kqp/ut/kqp_query_ut.cpp index 005ae38dc8..45951e4f6a 100644 --- a/ydb/core/kqp/ut/kqp_query_ut.cpp +++ b/ydb/core/kqp/ut/kqp_query_ut.cpp @@ -590,7 +590,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::UNSUPPORTED); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_UNSUPPORTED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("ATOM evaluation is not supported in YDB queries."); + return issue.GetMessage().Contains("ATOM evaluation is not supported in YDB queries."); })); } @@ -999,7 +999,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { )"), TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::UNSUPPORTED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_UNSUPPORTED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("EVALUATE IF is not supported in YDB queries."); + return issue.GetMessage().Contains("EVALUATE IF is not supported in YDB queries."); })); } @@ -1011,7 +1011,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { )"), TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::UNSUPPORTED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_UNSUPPORTED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("EVALUATE is not supported in YDB queries."); + return issue.GetMessage().Contains("EVALUATE is not supported in YDB queries."); })); } @@ -1049,7 +1049,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::UNSUPPORTED, result.GetIssues().ToString()); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_UNSUPPORTED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("ATOM evaluation is not supported in YDB queries."); + return issue.GetMessage().Contains("ATOM evaluation is not supported in YDB queries."); })); } } @@ -1066,7 +1066,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Execution failed"); + return issue.GetMessage().Contains("Execution failed"); })); } @@ -1099,7 +1099,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("not supported"); + return issue.GetMessage().Contains("not supported"); })); result = session.ExecuteDataQuery(Q_(R"( @@ -1108,7 +1108,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("not supported"); + return issue.GetMessage().Contains("not supported"); })); result = session.ExecuteDataQuery(Q_(R"( @@ -1117,7 +1117,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { result.GetIssues().PrintTo(Cerr); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("not supported"); + return issue.GetMessage().Contains("not supported"); })); } diff --git a/ydb/core/kqp/ut/kqp_scan_ut.cpp b/ydb/core/kqp/ut/kqp_scan_ut.cpp index 029c9010d8..ed666347f1 100644 --- a/ydb/core/kqp/ut/kqp_scan_ut.cpp +++ b/ydb/core/kqp/ut/kqp_scan_ut.cpp @@ -1235,7 +1235,7 @@ Y_UNIT_TEST_SUITE(KqpScan) { part.GetIssues().PrintTo(Cerr); UNIT_ASSERT(HasIssue(part.GetIssues(), NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Requested too many execution units"); + return issue.GetMessage().Contains("Requested too many execution units"); })); part = it.ReadNext().GetValueSync(); @@ -1672,8 +1672,8 @@ Y_UNIT_TEST_SUITE(KqpScan) { UNIT_ASSERT_C(!streamPart.EOS(), streamPart.GetIssues().ToString()); UNIT_ASSERT( HasIssue(streamPart.GetIssues(), NYql::TIssuesIds::DEFAULT_ERROR, [](const NYql::TIssue& issue) { - return issue.Message.Contains("Terminate was called") // general termination prefix - && issue.Message.Contains("Bad filter value."); // test specific UDF exception + return issue.GetMessage().Contains("Terminate was called") // general termination prefix + && issue.GetMessage().Contains("Bad filter value."); // test specific UDF exception })); }; @@ -1892,7 +1892,7 @@ Y_UNIT_TEST_SUITE(KqpScan) { auto result = it.ReadNext().GetValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::UNSUPPORTED); UNIT_ASSERT(HasIssue(result.GetIssues(), NYql::TIssuesIds::KIKIMR_UNSUPPORTED, [](const NYql::TIssue& issue) { - return issue.Message.Contains("ATOM evaluation is not supported in YDB queries."); + return issue.GetMessage().Contains("ATOM evaluation is not supported in YDB queries."); })); } diff --git a/ydb/core/tx/datashard/datashard_ut_kqp_errors.cpp b/ydb/core/tx/datashard/datashard_ut_kqp_errors.cpp index ad2af0255e..5144078da6 100644 --- a/ydb/core/tx/datashard/datashard_ut_kqp_errors.cpp +++ b/ydb/core/tx/datashard/datashard_ut_kqp_errors.cpp @@ -21,7 +21,7 @@ bool HasIssue(const TIssues& issues, ui32 code, TStringBuf message, std::functio for (auto& issue : issues) { WalkThroughIssues(issue, false, [&] (const TIssue& issue, int) { - if (!hasIssue && issue.GetCode() == code && (!message || message == issue.Message)) { + if (!hasIssue && issue.GetCode() == code && (!message || message == issue.GetMessage())) { hasIssue = !predicate || predicate(issue); } }); @@ -255,7 +255,7 @@ Y_UNIT_TEST(ProposeRequestUndelivered) { "Kikimr cluster or one of its subsystems was unavailable."), record.GetResponse().DebugString()); UNIT_ASSERT_C(HasIssue(issues, NYql::TIssuesIds::DEFAULT_ERROR, "", [] (const TIssue& issue) { - return issue.Message.StartsWith("Could not deliver program to shard "); + return issue.GetMessage().StartsWith("Could not deliver program to shard "); }), record.GetResponse().DebugString()); } @@ -313,7 +313,7 @@ Y_UNIT_TEST(ProposeResultLost_RoTx) { "Kikimr cluster or one of its subsystems was unavailable."), record.GetResponse().DebugString()); UNIT_ASSERT_C(HasIssue(issues, NKikimrIssues::TIssuesIds::TX_STATE_UNKNOWN, "", [] (const TIssue& issue) { - return issue.Message.StartsWith("Tx state unknown for shard "); + return issue.GetMessage().StartsWith("Tx state unknown for shard "); }), record.GetResponse().DebugString()); }); } @@ -334,7 +334,7 @@ Y_UNIT_TEST(ProposeResultLost_RwTx) { "State of operation is unknown."), record.GetResponse().DebugString()); UNIT_ASSERT_C(HasIssue(issues, NKikimrIssues::TIssuesIds::TX_STATE_UNKNOWN, "", [] (const TIssue& issue) { - return issue.Message.StartsWith("Tx state unknown for shard "); + return issue.GetMessage().StartsWith("Tx state unknown for shard "); }), record.GetResponse().DebugString()); }); } diff --git a/ydb/core/yq/libs/config/yq_issue.cpp b/ydb/core/yq/libs/config/yq_issue.cpp index f66ab2eb0c..3a128d5d04 100644 --- a/ydb/core/yq/libs/config/yq_issue.cpp +++ b/ydb/core/yq/libs/config/yq_issue.cpp @@ -8,28 +8,28 @@ namespace NYq { NYql::TIssue MakeFatalIssue(TIssuesIds::EIssueCode id, const TString& message) { NYql::TIssue issue; issue.SetCode(id, NYql::TSeverityIds::S_FATAL); - issue.Message = message; + issue.SetMessage(message); return issue; } NYql::TIssue MakeErrorIssue(TIssuesIds::EIssueCode id, const TString& message) { NYql::TIssue issue; issue.SetCode(id, NYql::TSeverityIds::S_ERROR); - issue.Message = message; + issue.SetMessage(message); return issue; } NYql::TIssue MakeWarningIssue(TIssuesIds::EIssueCode id, const TString& message) { NYql::TIssue issue; issue.SetCode(id, NYql::TSeverityIds::S_WARNING); - issue.Message = message; + issue.SetMessage(message); return issue; } NYql::TIssue MakeInfoIssue(TIssuesIds::EIssueCode id, const TString& message) { NYql::TIssue issue; issue.SetCode(id, NYql::TSeverityIds::S_INFO); - issue.Message = message; + issue.SetMessage(message); return issue; } diff --git a/ydb/core/yq/libs/control_plane_storage/events/events.h b/ydb/core/yq/libs/control_plane_storage/events/events.h index 03233ff1dd..a142d1b565 100644 --- a/ydb/core/yq/libs/control_plane_storage/events/events.h +++ b/ydb/core/yq/libs/control_plane_storage/events/events.h @@ -120,7 +120,7 @@ namespace { for (const auto& issue: issues) { NYql::WalkThroughIssues(issue, false, [&size](const auto& issue, ui16) { size += sizeof(issue); - size += issue.Message.size(); + size += issue.GetMessage().size(); }); } size += issues.Size() * sizeof(NYql::TIssue); diff --git a/ydb/library/yql/ast/yql_ast_ut.cpp b/ydb/library/yql/ast/yql_ast_ut.cpp index 23e140653d..6f228966c2 100644 --- a/ydb/library/yql/ast/yql_ast_ut.cpp +++ b/ydb/library/yql/ast/yql_ast_ut.cpp @@ -185,7 +185,7 @@ Y_UNIT_TEST_SUITE(TParseYqlAst) { UNIT_ASSERT(false == ast.IsOk()); UNIT_ASSERT(false == !!ast.Root); UNIT_ASSERT(false == ast.Issues.Empty()); - UNIT_ASSERT_STRINGS_EQUAL(ast.Issues.begin()->Message, expectedError); + UNIT_ASSERT_STRINGS_EQUAL(ast.Issues.begin()->GetMessage(), expectedError); } Y_UNIT_TEST(BadArbitraryAtom) { diff --git a/ydb/library/yql/ast/yql_expr.cpp b/ydb/library/yql/ast/yql_expr.cpp index 7d74174c3b..30da615cbe 100644 --- a/ydb/library/yql/ast/yql_expr.cpp +++ b/ydb/library/yql/ast/yql_expr.cpp @@ -782,8 +782,8 @@ namespace { TAstNode::NewLiteralAtom(TPosition(), err.Position.File, pool, TNodeFlags::ArbitraryContent) : TAstNode::NewAtom(TPosition(), err.Position.File, pool, TNodeFlags::ArbitraryContent); auto message = refAtoms ? - TAstNode::NewLiteralAtom(TPosition(), err.Message, pool, TNodeFlags::ArbitraryContent) : - TAstNode::NewAtom(TPosition(), err.Message, pool, TNodeFlags::ArbitraryContent); + TAstNode::NewLiteralAtom(TPosition(), err.GetMessage(), pool, TNodeFlags::ArbitraryContent) : + TAstNode::NewAtom(TPosition(), err.GetMessage(), pool, TNodeFlags::ArbitraryContent); return TAstNode::NewList(TPosition(), pool, self, row, column, file, message); } diff --git a/ydb/library/yql/ast/yql_type_string.cpp b/ydb/library/yql/ast/yql_type_string.cpp index 78ced74895..33876d45ad 100644 --- a/ydb/library/yql/ast/yql_type_string.cpp +++ b/ydb/library/yql/ast/yql_type_string.cpp @@ -1433,7 +1433,7 @@ private: Out_ << pos.Row << ':' << pos.Column << ':'; } - EscapeArbitraryAtom(type.GetError().Message, '\'', &Out_); + EscapeArbitraryAtom(type.GetError().GetMessage(), '\'', &Out_); Out_ << '>'; } diff --git a/ydb/library/yql/ast/yql_type_string_ut.cpp b/ydb/library/yql/ast/yql_type_string_ut.cpp index 4d9c61a331..655d7a6091 100644 --- a/ydb/library/yql/ast/yql_type_string_ut.cpp +++ b/ydb/library/yql/ast/yql_type_string_ut.cpp @@ -15,7 +15,7 @@ Y_UNIT_TEST_SUITE(TTypeString) UNIT_ASSERT(res == nullptr); UNIT_ASSERT(!errors.Empty()); errors.PrintWithProgramTo(Cerr, "-memory-", TString(prog)); - UNIT_ASSERT_STRINGS_EQUAL(errors.begin()->Message, expectedError); + UNIT_ASSERT_STRINGS_EQUAL(errors.begin()->GetMessage(), expectedError); UNIT_ASSERT_VALUES_EQUAL(errors.begin()->Position.Column, column); } diff --git a/ydb/library/yql/core/facade/yql_facade.cpp b/ydb/library/yql/core/facade/yql_facade.cpp index 89cdb29b36..04bed4adb9 100644 --- a/ydb/library/yql/core/facade/yql_facade.cpp +++ b/ydb/library/yql/core/facade/yql_facade.cpp @@ -378,7 +378,7 @@ bool TProgram::FillParseResult(NYql::TAstParseResult&& astRes, NYql::TWarningRul } iManager.AddScope([this]() { TIssuePtr issueHolder = new TIssue(); - issueHolder->Message = TStringBuilder() << "Parse " << SourceSyntax_; + issueHolder->SetMessage(TStringBuilder() << "Parse " << SourceSyntax_); issueHolder->Severity = TSeverityIds::S_INFO; return issueHolder; }); diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp index 617e9166c6..4e6a43e9b6 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.cpp +++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp @@ -4697,7 +4697,7 @@ TMaybe<TIssue> NormalizeName(TPosition position, TString& name) { TString NormalizeName(const TStringBuf& name) { TString result(name); TMaybe<TIssue> error = NormalizeName(TPosition(), result); - YQL_ENSURE(error.Empty(), "" << error->Message); + YQL_ENSURE(error.Empty(), "" << error->GetMessage()); return result; } @@ -4954,7 +4954,7 @@ TExprNode::TPtr ExpandTypeNoCache(TPositionHandle position, const TTypeAnnotatio ctx.NewAtom(position, ToString(err.Position.Row)), ctx.NewAtom(position, ToString(err.Position.Column)), ctx.NewAtom(position, err.Position.File), - ctx.NewAtom(position, err.Message) + ctx.NewAtom(position, err.GetMessage()) }); } diff --git a/ydb/library/yql/core/yql_library_compiler.cpp b/ydb/library/yql/core/yql_library_compiler.cpp index 79296792e6..c5cf012d7a 100644 --- a/ydb/library/yql/core/yql_library_compiler.cpp +++ b/ydb/library/yql/core/yql_library_compiler.cpp @@ -94,8 +94,8 @@ bool CompileLibrary(const TString& alias, const TString& script, TExprContext& c for (const auto& originalError : res.Issues) { TIssue error(originalError); TStringBuilder message; - message << error.Message << " (at " << alias << ")"; - error.Message = message; + message << error.GetMessage() << " (at " << alias << ")"; + error.SetMessage(message); ctx.AddError(error); } return false; diff --git a/ydb/library/yql/core/yql_type_helpers.cpp b/ydb/library/yql/core/yql_type_helpers.cpp index 9ae7cab56f..884c6f29dc 100644 --- a/ydb/library/yql/core/yql_type_helpers.cpp +++ b/ydb/library/yql/core/yql_type_helpers.cpp @@ -93,7 +93,7 @@ const TTypeAnnotationNode* GetSequenceItemType(NNodes::TExprBase listNode, bool TIssue error; if (!SilentGetSequenceItemType({}, *listNode.Ref().GetTypeAnn(), allowMultiIO, itemType, error)) { // position is not used - YQL_ENSURE(false, "" << error.Message); + YQL_ENSURE(false, "" << error.GetMessage()); } return itemType; } diff --git a/ydb/library/yql/dq/actors/compute/ut/dq_compute_issues_buffer_ut.cpp b/ydb/library/yql/dq/actors/compute/ut/dq_compute_issues_buffer_ut.cpp index 64ee3679af..c9f32e1bce 100644 --- a/ydb/library/yql/dq/actors/compute/ut/dq_compute_issues_buffer_ut.cpp +++ b/ydb/library/yql/dq/actors/compute/ut/dq_compute_issues_buffer_ut.cpp @@ -24,7 +24,7 @@ Y_UNIT_TEST_SUITE(TIssuesBufferTest) { const auto dumps = buffer.Dump(); UNIT_ASSERT_VALUES_EQUAL(dumps.size(), 1); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->Message, "issue1"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->GetMessage(), "issue1"); } Y_UNIT_TEST(TestPushWithOverflow) { @@ -41,8 +41,8 @@ Y_UNIT_TEST_SUITE(TIssuesBufferTest) { const auto dumps = buffer.Dump(); UNIT_ASSERT_VALUES_EQUAL(dumps.size(), 2); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->Message, "issue2"); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(1).Issues.begin()->Message, "issue3"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->GetMessage(), "issue2"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(1).Issues.begin()->GetMessage(), "issue3"); } Y_UNIT_TEST(TestSmallBuffer) { @@ -59,7 +59,7 @@ Y_UNIT_TEST_SUITE(TIssuesBufferTest) { const auto dumps = buffer.Dump(); UNIT_ASSERT_VALUES_EQUAL(dumps.size(), 1); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->Message, "issue3"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->GetMessage(), "issue3"); } Y_UNIT_TEST(TestUseAfterDump) { @@ -79,8 +79,8 @@ Y_UNIT_TEST_SUITE(TIssuesBufferTest) { UNIT_ASSERT_VALUES_EQUAL(buffer.GetAllAddedIssuesCount(), 4); const auto dumps = buffer.Dump(); UNIT_ASSERT_VALUES_EQUAL(dumps.size(), 2); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->Message, "issue3"); - UNIT_ASSERT_STRINGS_EQUAL(dumps.at(1).Issues.begin()->Message, "issue4"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(0).Issues.begin()->GetMessage(), "issue3"); + UNIT_ASSERT_STRINGS_EQUAL(dumps.at(1).Issues.begin()->GetMessage(), "issue4"); } } diff --git a/ydb/library/yql/parser/pg_wrapper/ut/parser_ut.cpp b/ydb/library/yql/parser/pg_wrapper/ut/parser_ut.cpp index bbf0680dbe..972cfec012 100644 --- a/ydb/library/yql/parser/pg_wrapper/ut/parser_ut.cpp +++ b/ydb/library/yql/parser/pg_wrapper/ut/parser_ut.cpp @@ -39,7 +39,7 @@ Y_UNIT_TEST_SUITE(TWrapperTests) { PGParse(TString(" \n SELECT1"), events); UNIT_ASSERT(!events.Result); UNIT_ASSERT(events.Issue); - auto msg = events.Issue->Message; + auto msg = events.Issue->GetMessage(); UNIT_ASSERT_NO_DIFF(msg, "syntax error at or near \"SELECT1\""); UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Row, 2); UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Column, 3); @@ -94,7 +94,7 @@ Y_UNIT_TEST_SUITE(TMTWrapperTests) { PGParse(TString(" \n SELECT1"), events); Y_ENSURE(!events.Result); Y_ENSURE(events.Issue); - auto msg = events.Issue->Message; + auto msg = events.Issue->GetMessage(); Y_ENSURE(msg == "syntax error at or near \"SELECT1\""); Y_ENSURE(events.Issue->Position.Row == 2); Y_ENSURE(events.Issue->Position.Column == 3); diff --git a/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp b/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp index a456f70679..2417754956 100644 --- a/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp +++ b/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp @@ -1464,18 +1464,18 @@ TMkqlCommonCallableCompiler::TShared::TShared() { const auto rightTupleType = rightItemType->Cast<TMultiExprType>(); const auto outputTupleType = outputItemType->Cast<TMultiExprType>(); - node.Child(3)->ForEachChild([&](TExprNode& child){ - leftKeyColumns.emplace_back(*GetFieldPosition(*leftTupleType, child.Content())); + node.Child(3)->ForEachChild([&](TExprNode& child){ + leftKeyColumns.emplace_back(*GetFieldPosition(*leftTupleType, child.Content())); }); - node.Child(4)->ForEachChild([&](TExprNode& child){ + node.Child(4)->ForEachChild([&](TExprNode& child){ rightKeyColumns.emplace_back(*GetFieldPosition(*rightTupleType, child.Content())); }); bool s = false; - node.Child(5)->ForEachChild([&](TExprNode& child){ + node.Child(5)->ForEachChild([&](TExprNode& child){ leftRenames.emplace_back(*GetFieldPosition((s = !s) ? *leftTupleType : *outputTupleType, child.Content())); }); s = false; node.Child(6)->ForEachChild([&](TExprNode& child){ - rightRenames.emplace_back(*GetFieldPosition((s = !s) ? *rightTupleType : *outputTupleType, child.Content())); - + rightRenames.emplace_back(*GetFieldPosition((s = !s) ? *rightTupleType : *outputTupleType, child.Content())); + }); const auto returnType = BuildType(node, *node.GetTypeAnn(), ctx.ProgramBuilder); @@ -1708,7 +1708,7 @@ TMkqlCommonCallableCompiler::TShared::TShared() { TMaybe<ui64> itemsCount; bool isCompact; if (const auto error = ParseToDictSettings(node, ctx.ExprCtx, isMany, isHashed, itemsCount, isCompact)) { - ythrow TNodeException(node) << error->Message; + ythrow TNodeException(node) << error->GetMessage(); } const auto factory = *isHashed ? &TProgramBuilder::ToHashedDict : &TProgramBuilder::ToSortedDict; @@ -1726,7 +1726,7 @@ TMkqlCommonCallableCompiler::TShared::TShared() { TMaybe<ui64> itemsCount; bool isCompact; if (const auto error = ParseToDictSettings(node, ctx.ExprCtx, isMany, isHashed, itemsCount, isCompact)) { - ythrow TNodeException(node) << error->Message; + ythrow TNodeException(node) << error->GetMessage(); } const auto factory = *isHashed ? &TProgramBuilder::SqueezeToHashedDict : &TProgramBuilder::SqueezeToSortedDict; @@ -1744,7 +1744,7 @@ TMkqlCommonCallableCompiler::TShared::TShared() { TMaybe<ui64> itemsCount; bool isCompact; if (const auto error = ParseToDictSettings(node, ctx.ExprCtx, isMany, isHashed, itemsCount, isCompact)) { - ythrow TNodeException(node) << error->Message; + ythrow TNodeException(node) << error->GetMessage(); } const auto factory = *isHashed ? &TProgramBuilder::NarrowSqueezeToHashedDict : &TProgramBuilder::NarrowSqueezeToSortedDict; @@ -2123,12 +2123,12 @@ TMkqlCommonCallableCompiler::TShared::TShared() { AddCallable("Error", [](const TExprNode& node, TMkqlBuildContext& ctx)->NKikimr::NMiniKQL::TRuntimeNode { const auto err = node.GetTypeAnn()->Cast<TErrorExprType>()->GetError(); - ythrow TNodeException(ctx.ExprCtx.AppendPosition(err.Position)) << err.Message; + ythrow TNodeException(ctx.ExprCtx.AppendPosition(err.Position)) << err.GetMessage(); }); AddCallable("ErrorType", [](const TExprNode& node, TMkqlBuildContext& ctx)->NKikimr::NMiniKQL::TRuntimeNode { const auto err = node.GetTypeAnn()->Cast<TTypeExprType>()->GetType()->Cast<TErrorExprType>()->GetError(); - ythrow TNodeException(ctx.ExprCtx.AppendPosition(err.Position)) << err.Message; + ythrow TNodeException(ctx.ExprCtx.AppendPosition(err.Position)) << err.GetMessage(); }); AddCallable("Join", [](const TExprNode& node, TMkqlBuildContext& ctx) { diff --git a/ydb/library/yql/providers/common/schema/expr/yql_expr_schema.cpp b/ydb/library/yql/providers/common/schema/expr/yql_expr_schema.cpp index 8b71560f75..1031e0a495 100644 --- a/ydb/library/yql/providers/common/schema/expr/yql_expr_schema.cpp +++ b/ydb/library/yql/providers/common/schema/expr/yql_expr_schema.cpp @@ -146,7 +146,7 @@ class TExprTypeSaver: public TSaver<TExprTypeSaver<TSaver>> { TBase::Writer.OnListItem(); TBase::Writer.OnStringScalar(err.Position.File); TBase::Writer.OnListItem(); - TBase::Writer.OnStringScalar(err.Message); + TBase::Writer.OnStringScalar(err.GetMessage()); TBase::Writer.OnEndList(); } diff --git a/ydb/library/yql/providers/dq/actors/grouped_issues.cpp b/ydb/library/yql/providers/dq/actors/grouped_issues.cpp index 2d955fadea..862821ae99 100644 --- a/ydb/library/yql/providers/dq/actors/grouped_issues.cpp +++ b/ydb/library/yql/providers/dq/actors/grouped_issues.cpp @@ -14,7 +14,7 @@ NYql::TIssues NYql::NDq::GroupedIssues::ToIssues() { }); for (auto& [issue, meta]: issueVector) { - auto modified_issue_message = issue.Message + " " + meta.InfoString(); + auto modified_issue_message = issue.GetMessage() + " " + meta.InfoString(); auto modified_issue = NYql::TIssue(issue.Position, issue.EndPosition, modified_issue_message); issues.AddIssue(modified_issue); } diff --git a/ydb/library/yql/providers/dq/provider/exec/yql_dq_exectransformer.cpp b/ydb/library/yql/providers/dq/provider/exec/yql_dq_exectransformer.cpp index f3c7bcade1..bc505f924a 100644 --- a/ydb/library/yql/providers/dq/provider/exec/yql_dq_exectransformer.cpp +++ b/ydb/library/yql/providers/dq/provider/exec/yql_dq_exectransformer.cpp @@ -1220,7 +1220,7 @@ private: } if (error) { - issue.Message = "Too big result " + trStr; + issue.SetMessage("Too big result " + trStr); issue.Severity = TSeverityIds::S_ERROR; } ctx.IssueManager.RaiseIssue(issue); @@ -1652,7 +1652,7 @@ private: } if (neverFallback) { - issue.Message = "Too big precompute result"; + issue.SetMessage("Too big precompute result"); issue.Severity = TSeverityIds::S_ERROR; } ctx.IssueManager.RaiseIssue(issue); diff --git a/ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp b/ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp index fe5d7f8b64..d5a6759d49 100644 --- a/ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp +++ b/ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp @@ -547,7 +547,7 @@ private: } catch (const TDtorException&) { throw; } catch (const std::exception& err) { - exceptIssue.Message = TStringBuilder() << "Error while reading file " << Path << ", details: " << err.what(); + exceptIssue.SetMessage(TStringBuilder() << "Error while reading file " << Path << ", details: " << err.what()); fatalCode = NYql::NDqProto::StatusIds::INTERNAL_ERROR; RetryStuff->Cancel(); } @@ -565,7 +565,7 @@ private: Issues.AddIssues(BuildIssues(HttpResponseCode, errorCode, message)); } - if (exceptIssue.Message) { + if (exceptIssue.GetMessage()) { Issues.AddIssue(exceptIssue); } diff --git a/ydb/library/yql/public/issue/yql_issue.cpp b/ydb/library/yql/public/issue/yql_issue.cpp index 3b89156874..b8d76a09c4 100644 --- a/ydb/library/yql/public/issue/yql_issue.cpp +++ b/ydb/library/yql/public/issue/yql_issue.cpp @@ -196,7 +196,7 @@ void TIssues::PrintWithProgramTo( out << Purple() << issue.Range() << Old(); auto color = (issue.GetSeverity() == TSeverityIds::S_WARNING) ? Yellow() : LightRed(); auto severityName = SeverityToString(issue.GetSeverity()); - out << color << ": "<< severityName << ": " << issue.Message << Old() << '\n'; + out << color << ": "<< severityName << ": " << issue.GetMessage() << Old() << '\n'; Indent(out, shift); if (issue.Position.HasValue()) { out << '\t' << lines[issue.Position.Row] << '\n'; diff --git a/ydb/library/yql/public/issue/yql_issue.h b/ydb/library/yql/public/issue/yql_issue.h index 7b97674c9d..8ad69a20bd 100644 --- a/ydb/library/yql/public/issue/yql_issue.h +++ b/ydb/library/yql/public/issue/yql_issue.h @@ -109,10 +109,10 @@ class TIssue; using TIssuePtr = TIntrusivePtr<TIssue>; class TIssue: public TThrRefBase { TVector<TIntrusivePtr<TIssue>> Children_; + TString Message; public: TPosition Position; TPosition EndPosition; - TString Message; TIssueCode IssueCode = 0U; ESeverity Severity = TSeverityIds::S_ERROR; @@ -120,18 +120,18 @@ public: template <typename T> explicit TIssue(const T& message) - : Position(TPosition()) + : Message(message) + , Position(TPosition()) , EndPosition(TPosition()) - , Message(message) { SanitizeNonAscii(Message); } template <typename T> TIssue(TPosition position, const T& message) - : Position(position) + : Message(message) + , Position(position) , EndPosition(position) - , Message(message) { SanitizeNonAscii(Message); } @@ -142,9 +142,9 @@ public: template <typename T> TIssue(TPosition position, TPosition endPosition, const T& message) - : Position(position) + : Message(message) + , Position(position) , EndPosition(endPosition) - , Message(message) { SanitizeNonAscii(Message); } @@ -169,6 +169,12 @@ public: return *this; } + TIssue& SetMessage(const TString& msg) { + Message = msg; + SanitizeNonAscii(Message); + return *this; + } + ESeverity GetSeverity() const { return Severity; } @@ -177,6 +183,10 @@ public: return IssueCode; } + const TString& GetMessage() const { + return Message; + } + TIssue& AddSubIssue(TIntrusivePtr<TIssue> issue) { Severity = (ESeverity)Min((ui32)issue->GetSeverity(), (ui32)Severity); Children_.push_back(issue); @@ -194,6 +204,20 @@ public: PrintTo(out, oneLine); return out.Str(); } + + // Unsafe method. Doesn't call SanitizeNonAscii(Message) + TString* MutableMessage() { + return &Message; + } + + TIssue& CopyWithoutSubIssues(const TIssue& src) { + Message = src.Message; + IssueCode = src.IssueCode; + Severity = src.Severity; + Position = src.Position; + EndPosition = src.EndPosition; + return *this; + } }; void WalkThroughIssues(const TIssue& topIssue, bool leafOnly, std::function<void(const TIssue&, ui16 level)> fn, std::function<void(const TIssue&, ui16 level)> afterChildrenFn = {}); @@ -246,7 +270,7 @@ public: inline void AddIssues(const TPosition& pos, const TIssues& errors) { Issues_.reserve(Issues_.size() + errors.Size()); for (const auto& e: errors) { - Issues_.push_back(TIssue(pos, e.Message)); + Issues_.push_back(TIssue(pos, e.GetMessage())); } } diff --git a/ydb/library/yql/public/issue/yql_issue_manager.cpp b/ydb/library/yql/public/issue/yql_issue_manager.cpp index 08daf0fcdd..3277abe688 100644 --- a/ydb/library/yql/public/issue/yql_issue_manager.cpp +++ b/ydb/library/yql/public/issue/yql_issue_manager.cpp @@ -38,15 +38,15 @@ void TIssueManager::LeaveScope() { if (subIssue->GetSubIssues().size() == 1) { auto nestedIssue = subIssue->GetSubIssues().front(); if (!nestedIssue->GetSubIssues().empty() && nestedIssue->Position == subIssue->Position && nestedIssue->EndPosition == subIssue->EndPosition) { - auto msg = subIssue->Message; - if (nestedIssue->Message) { + auto msg = subIssue->GetMessage(); + if (nestedIssue->GetMessage()) { if (msg) { msg.append(", "); } - msg.append(nestedIssue->Message); + msg.append(nestedIssue->GetMessage()); } subIssue = nestedIssue; - subIssue->Message = msg; + subIssue->SetMessage(msg); } } RawIssues_.pop(); @@ -149,7 +149,7 @@ bool TIssueManager::RaiseWarning(TIssue issue) { if (WarningToErrorTreatMessage_) { TIssue newIssue; newIssue.SetCode(issue.GetCode(), ESeverity::TSeverityIds_ESeverityId_S_ERROR); - newIssue.Message = WarningToErrorTreatMessage_.GetRef(); + newIssue.SetMessage(WarningToErrorTreatMessage_.GetRef()); newIssue.AddSubIssue(new TIssue(issue)); issue = newIssue; } @@ -196,7 +196,7 @@ void TIssueManager::AddIssues(const TIssues& issues) { void TIssueManager::AddIssues(const TPosition& pos, const TIssues& issues) { for (auto& issue: issues) { - if (auto p = CheckUniqAndLimit(TIssue(pos, issue.Message))) { + if (auto p = CheckUniqAndLimit(TIssue(pos, issue.GetMessage()))) { CompletedIssues_.AddIssue(*p); } } diff --git a/ydb/library/yql/public/issue/yql_issue_manager_ut.cpp b/ydb/library/yql/public/issue/yql_issue_manager_ut.cpp index 287f63fedd..e3308163c3 100644 --- a/ydb/library/yql/public/issue/yql_issue_manager_ut.cpp +++ b/ydb/library/yql/public/issue/yql_issue_manager_ut.cpp @@ -56,10 +56,10 @@ Y_UNIT_TEST_SUITE(TIssueManagerTest) { auto issues = issueManager.GetIssues(); UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1); auto scopeIssue = issues.begin(); - UNIT_ASSERT_VALUES_EQUAL(scopeIssue->Message, "A"); + UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A"); auto subIssues = scopeIssue->GetSubIssues(); UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1); - UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->Message, "IssueOne"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "IssueOne"); } Y_UNIT_TEST(OneErrorTwoLevelsTest) { @@ -72,13 +72,13 @@ Y_UNIT_TEST_SUITE(TIssueManagerTest) { auto issues = issueManager.GetIssues(); UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1); auto scopeIssue = issues.begin(); - UNIT_ASSERT_VALUES_EQUAL(scopeIssue->Message, "A"); + UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A"); auto subIssues = scopeIssue->GetSubIssues(); UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1); - UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->Message, "B"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "B"); UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 1); - UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues()[0]->Message, "IssueOne"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues()[0]->GetMessage(), "IssueOne"); } Y_UNIT_TEST(MultiErrorsMultiLevelsTest) { @@ -98,11 +98,11 @@ Y_UNIT_TEST_SUITE(TIssueManagerTest) { auto subIssues = scopeIssue->GetSubIssues(); UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 2); UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetSubIssues().size(), 0); //WarningScope1 - UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->Message, "WarningScope1"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "WarningScope1"); UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues().size(), 2); UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues().size(), 1); - UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues()[0]->Message, "ErrorScope3"); - UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[1]->Message, "ErrorScope2"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[0]->GetSubIssues()[0]->GetMessage(), "ErrorScope3"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[1]->GetSubIssues()[1]->GetMessage(), "ErrorScope2"); auto ref = R"___(<main>: Error: A <main>: Error: WarningScope1 <main>:1:1: Error: B @@ -122,10 +122,10 @@ Y_UNIT_TEST_SUITE(TIssueManagerTest) { auto issues = issueManager.GetIssues(); UNIT_ASSERT_VALUES_EQUAL(issues.Size(), 1); auto scopeIssue = issues.begin(); - UNIT_ASSERT_VALUES_EQUAL(scopeIssue->Message, "A"); + UNIT_ASSERT_VALUES_EQUAL(scopeIssue->GetMessage(), "A"); auto subIssues = scopeIssue->GetSubIssues(); UNIT_ASSERT_VALUES_EQUAL(subIssues.size(), 1); - UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->Message, "ErrorScope1"); + UNIT_ASSERT_VALUES_EQUAL(subIssues[0]->GetMessage(), "ErrorScope1"); } Y_UNIT_TEST(FuseScopesTest) { diff --git a/ydb/library/yql/public/issue/yql_issue_message.cpp b/ydb/library/yql/public/issue/yql_issue_message.cpp index f9d512ca5a..15a3202b52 100644 --- a/ydb/library/yql/public/issue/yql_issue_message.cpp +++ b/ydb/library/yql/public/issue/yql_issue_message.cpp @@ -73,7 +73,7 @@ void IssueToMessage(const TIssue& topIssue, TIssueMessage* issueMessage) { endPosition.set_row(issue.EndPosition.Row); endPosition.set_column(issue.EndPosition.Column); } - message.set_message(issue.Message); + message.set_message(issue.GetMessage()); message.set_issue_code(issue.GetCode()); message.set_severity(issue.GetSeverity()); diff --git a/ydb/library/yql/public/issue/yql_issue_ut.cpp b/ydb/library/yql/public/issue/yql_issue_ut.cpp index 87b417da39..0b13e4c2fc 100644 --- a/ydb/library/yql/public/issue/yql_issue_ut.cpp +++ b/ydb/library/yql/public/issue/yql_issue_ut.cpp @@ -1,10 +1,13 @@ #include "yql_issue.h" +#include "yql_issue_message.h" #include <library/cpp/testing/unittest/registar.h> #include <ydb/library/yql/public/issue/protos/issue_message.pb.h> #include <ydb/library/yql/public/issue/yql_issue_message.h> #include <ydb/public/api/protos/ydb_issue_message.pb.h> +#include <util/charset/utf8.h> + #include <google/protobuf/message.h> #include <google/protobuf/descriptor.h> @@ -46,13 +49,13 @@ void ensureMessageTypesSame(const Descriptor* a, const Descriptor* b, THashSet<T Y_UNIT_TEST_SUITE(IssueTest) { Y_UNIT_TEST(Ascii) { TIssue issue1("тест abc"); - UNIT_ASSERT_VALUES_EQUAL(issue1.Message, "тест abc"); + UNIT_ASSERT_VALUES_EQUAL(issue1.GetMessage(), "тест abc"); TIssue issue2("\xFF abc"); - UNIT_ASSERT_VALUES_EQUAL(issue2.Message, "? abc"); + UNIT_ASSERT_VALUES_EQUAL(issue2.GetMessage(), "? abc"); TIssue issue3(""); - UNIT_ASSERT_VALUES_EQUAL(issue3.Message, ""); + UNIT_ASSERT_VALUES_EQUAL(issue3.GetMessage(), ""); TIssue issue4("abc"); - UNIT_ASSERT_VALUES_EQUAL(issue4.Message, "abc"); + UNIT_ASSERT_VALUES_EQUAL(issue4.GetMessage(), "abc"); } } @@ -137,3 +140,46 @@ Y_UNIT_TEST_SUITE(ToOneLineStringTest) { UNIT_ASSERT_STRINGS_EQUAL(issues.ToOneLineString(), "[ { file.abc:34:12: Error: error subissue: { <main>: Error: suberror } } { abc.file:2:100: Error: my message } ]"); } } + +Y_UNIT_TEST_SUITE(ToMessage) { + Y_UNIT_TEST(NonUtf8) { + TString s; + int chars[] = { + 0x7f, + 0xf8, + 0xf7, + 0xff, + 0xf8, + 0x1f, + 0xff, + 0xf2, + 0xaf, + 0xbf, + 0xfe, + 0xfa, + 0xf5, + 0x7f, + 0xfe, + 0xfa, + 0x27, + 0x20, + 0x7d, + 0x20, + 0x5d, + 0x2e + }; + for (int i : chars) { + s.append(static_cast<char>(i)); + } + UNIT_ASSERT(!IsUtf(s)); + TIssue issue; + issue.SetMessage(s); + + Ydb::Issue::IssueMessage msg; + IssueToMessage(issue, &msg); + TString serialized; + UNIT_ASSERT(msg.SerializeToString(&serialized)); + Ydb::Issue::IssueMessage msg2; + UNIT_ASSERT(msg2.ParseFromString(serialized)); + } +} diff --git a/ydb/library/yql/public/issue/yql_issue_utils.cpp b/ydb/library/yql/public/issue/yql_issue_utils.cpp index 364560ea4d..2be0b8e57b 100644 --- a/ydb/library/yql/public/issue/yql_issue_utils.cpp +++ b/ydb/library/yql/public/issue/yql_issue_utils.cpp @@ -63,14 +63,6 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) { } leafs.clear(); - auto copyIssue = [](TIssue& target, const TIssue& src) { - target.Message = src.Message; - target.IssueCode = src.IssueCode; - target.Severity = src.Severity; - target.Position = src.Position; - target.EndPosition = src.EndPosition; - }; - TIssue result; for (auto& i: issues) { const auto srcIssue = std::get<0>(i); @@ -82,7 +74,7 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) { if (0 == level) { targetIssue = &result; - copyIssue(*targetIssue, *srcIssue); + targetIssue->CopyWithoutSubIssues(*srcIssue); } else if (visible) { auto& parentRec = issues.at(visibleParent); auto& parentTargetIssue = std::get<1>(parentRec); @@ -96,12 +88,12 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) { parentSkipIssue = newIssue.Get(); } auto newIssue = MakeIntrusive<TIssue>(TString{}); - copyIssue(*newIssue, *srcIssue); + newIssue->CopyWithoutSubIssues(*srcIssue); parentSkipIssue->AddSubIssue(newIssue); targetIssue = newIssue.Get(); } else { auto newIssue = MakeIntrusive<TIssue>(TString{}); - copyIssue(*newIssue, *srcIssue); + newIssue->CopyWithoutSubIssues(*srcIssue); parentTargetIssue->AddSubIssue(newIssue); targetIssue = newIssue.Get(); } @@ -111,4 +103,3 @@ TIssue TruncateIssueLevels(const TIssue& topIssue, TTruncateIssueOpts opts) { } } // namspace NYql - diff --git a/ydb/library/yql/sql/v0/builtin.cpp b/ydb/library/yql/sql/v0/builtin.cpp index a0945f9d05..ed4b8b0261 100644 --- a/ydb/library/yql/sql/v0/builtin.cpp +++ b/ydb/library/yql/sql/v0/builtin.cpp @@ -2194,7 +2194,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec if (ns.empty()) { TMaybe<TIssue> error = NormalizeName(pos, normalizedName); if (!error.Empty()) { - return new TInvalidBuiltin(pos, error->Message); + return new TInvalidBuiltin(pos, error->GetMessage()); } auto coreFunc = coreFuncs.find(normalizedName); @@ -2358,7 +2358,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec auto aggNormalizedName = *args[0]->GetLiteral("String"); auto error = NormalizeName(pos, aggNormalizedName); if (!error.Empty()) { - return new TInvalidBuiltin(pos, error->Message); + return new TInvalidBuiltin(pos, error->GetMessage()); } if (aggNormalizedName == "aggregateby") { diff --git a/ydb/library/yql/sql/v0/context.cpp b/ydb/library/yql/sql/v0/context.cpp index a3a9013f2b..6a7ef8e00f 100644 --- a/ydb/library/yql/sql/v0/context.cpp +++ b/ydb/library/yql/sql/v0/context.cpp @@ -141,7 +141,7 @@ IOutputStream& TContext::MakeIssue(ESeverity severity, TIssueCode code, NYql::TP auto& curIssue = Issues.back(); curIssue.Severity = severity; curIssue.IssueCode = code; - IssueMsgHolder.Reset(new TStringOutput(Issues.back().Message)); + IssueMsgHolder.Reset(new TStringOutput(*Issues.back().MutableMessage())); return *IssueMsgHolder; } diff --git a/ydb/library/yql/sql/v0/query.cpp b/ydb/library/yql/sql/v0/query.cpp index 7752b28b01..92411bc008 100644 --- a/ydb/library/yql/sql/v0/query.cpp +++ b/ydb/library/yql/sql/v0/query.cpp @@ -329,7 +329,7 @@ public: for (auto& hint: Hints) { TMaybe<TIssue> normalizeError = NormalizeName(Pos, hint); if (!normalizeError.Empty()) { - ctx.Error() << normalizeError->Message; + ctx.Error() << normalizeError->GetMessage(); ctx.IncrementMonCounter("sql_errors", "NormalizeHintError"); return false; } diff --git a/ydb/library/yql/sql/v0/sql.cpp b/ydb/library/yql/sql/v0/sql.cpp index b028fc0439..9b3091044f 100644 --- a/ydb/library/yql/sql/v0/sql.cpp +++ b/ydb/library/yql/sql/v0/sql.cpp @@ -4574,7 +4574,7 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success TString normalizedPragma(pragma); TMaybe<TIssue> normalizeError = NormalizeName(Ctx.Pos(), normalizedPragma); if (!normalizeError.Empty()) { - Error() << normalizeError->Message; + Error() << normalizeError->GetMessage(); Ctx.IncrementMonCounter("sql_errors", "NormalizePragmaError"); return {}; } diff --git a/ydb/library/yql/sql/v1/builtin.cpp b/ydb/library/yql/sql/v1/builtin.cpp index c3bf4a7c78..a225305c80 100644 --- a/ydb/library/yql/sql/v1/builtin.cpp +++ b/ydb/library/yql/sql/v1/builtin.cpp @@ -3191,7 +3191,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec if (ns.empty()) { TMaybe<TIssue> error = NormalizeName(pos, normalizedName); if (!error.Empty()) { - return new TInvalidBuiltin(pos, error->Message); + return new TInvalidBuiltin(pos, error->GetMessage()); } auto coreFunc = coreFuncs.find(normalizedName); @@ -3439,7 +3439,7 @@ TNodePtr BuildBuiltinFunc(TContext& ctx, TPosition pos, TString name, const TVec auto aggNormalizedName = *args[0]->GetLiteral("String"); auto error = NormalizeName(pos, aggNormalizedName); if (!error.Empty()) { - return new TInvalidBuiltin(pos, error->Message); + return new TInvalidBuiltin(pos, error->GetMessage()); } if (aggNormalizedName == "aggregateby") { diff --git a/ydb/library/yql/sql/v1/context.cpp b/ydb/library/yql/sql/v1/context.cpp index 5ec69a5662..2c12c1c2c8 100644 --- a/ydb/library/yql/sql/v1/context.cpp +++ b/ydb/library/yql/sql/v1/context.cpp @@ -236,7 +236,7 @@ IOutputStream& TContext::MakeIssue(ESeverity severity, TIssueCode code, NYql::TP auto& curIssue = Issues.back(); curIssue.Severity = severity; curIssue.IssueCode = code; - IssueMsgHolder.Reset(new TStringOutput(Issues.back().Message)); + IssueMsgHolder.Reset(new TStringOutput(*Issues.back().MutableMessage())); return *IssueMsgHolder; } diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp index f09522778b..3b432d884e 100644 --- a/ydb/library/yql/sql/v1/query.cpp +++ b/ydb/library/yql/sql/v1/query.cpp @@ -477,7 +477,7 @@ public: TString hintName = hint.first; TMaybe<TIssue> normalizeError = NormalizeName(Pos, hintName); if (!normalizeError.Empty()) { - ctx.Error() << normalizeError->Message; + ctx.Error() << normalizeError->GetMessage(); ctx.IncrementMonCounter("sql_errors", "NormalizeHintError"); return false; } @@ -536,7 +536,7 @@ public: TString hintName = hint.first; TMaybe<TIssue> normalizeError = NormalizeName(Pos, hintName); if (!normalizeError.Empty()) { - ctx.Error() << normalizeError->Message; + ctx.Error() << normalizeError->GetMessage(); ctx.IncrementMonCounter("sql_errors", "NormalizeHintError"); return false; } diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp index 458e2a3477..2523a379b0 100644 --- a/ydb/library/yql/sql/v1/sql.cpp +++ b/ydb/library/yql/sql/v1/sql.cpp @@ -7234,7 +7234,7 @@ bool TGroupByClause::Build(const TRule_group_by_clause& node) { TString mode = Id(node.GetBlock6().GetRule_an_id2(), *this); TMaybe<TIssue> normalizeError = NormalizeName(Ctx.Pos(), mode); if (!normalizeError.Empty()) { - Error() << normalizeError->Message; + Error() << normalizeError->GetMessage(); Ctx.IncrementMonCounter("sql_errors", "NormalizeGroupByModeError"); return false; } @@ -9412,7 +9412,7 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success TString normalizedPragma(pragma); TMaybe<TIssue> normalizeError = NormalizeName(Ctx.Pos(), normalizedPragma); if (!normalizeError.Empty()) { - Error() << normalizeError->Message; + Error() << normalizeError->GetMessage(); Ctx.IncrementMonCounter("sql_errors", "NormalizePragmaError"); return {}; } diff --git a/ydb/services/ydb/ydb_table_ut.cpp b/ydb/services/ydb/ydb_table_ut.cpp index 3875bf3978..d1b81d41b4 100644 --- a/ydb/services/ydb/ydb_table_ut.cpp +++ b/ydb/services/ydb/ydb_table_ut.cpp @@ -54,7 +54,7 @@ bool HasIssue(const NYql::TIssues& issues, ui32 code, std::string_view message, for (auto& issue : issues) { NYql::WalkThroughIssues(issue, false, [&] (const NYql::TIssue& issue, int) { - if (!hasIssue && issue.GetCode() == code && (message.empty() || message == issue.Message)) { + if (!hasIssue && issue.GetCode() == code && (message.empty() || message == issue.GetMessage())) { hasIssue = !predicate || predicate(issue); } }); |