diff options
author | Mikhail Surin <surinmike@gmail.com> | 2022-05-24 20:41:23 +0300 |
---|---|---|
committer | Mikhail Surin <surinmike@gmail.com> | 2022-05-24 20:41:23 +0300 |
commit | 997a36b0da76d8e18cdd8680670aa9adbd50733f (patch) | |
tree | 42737679ef5132a3b9e373a040caa11093340fb5 | |
parent | 6e003715081366d7f1440ce6b2fa3789738e5f4b (diff) | |
download | ydb-997a36b0da76d8e18cdd8680670aa9adbd50733f.tar.gz |
Add column in type cast error message
ref:c3d3c88c18b4c105bfbceb46c3c436c9bd71129f
-rw-r--r-- | ydb/core/kqp/ut/kqp_yql_ut.cpp | 26 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_type_annotation.cpp | 18 | ||||
-rw-r--r-- | ydb/library/yql/public/issue/yql_issue_manager.cpp | 30 | ||||
-rw-r--r-- | ydb/library/yql/public/issue/yql_issue_manager.h | 7 | ||||
-rw-r--r-- | ydb/services/ydb/ydb_table_ut.cpp | 1 |
5 files changed, 61 insertions, 21 deletions
diff --git a/ydb/core/kqp/ut/kqp_yql_ut.cpp b/ydb/core/kqp/ut/kqp_yql_ut.cpp index 67b87ea306..616fc91aa7 100644 --- a/ydb/core/kqp/ut/kqp_yql_ut.cpp +++ b/ydb/core/kqp/ut/kqp_yql_ut.cpp @@ -309,6 +309,32 @@ Y_UNIT_TEST_SUITE(KqpYql) { [[2u];["Two"]] ])", FormatResultSetYson(result.GetResultSet(0))); } + + Y_UNIT_TEST_NEW_ENGINE(ColumnTypeMismatch) { + TKikimrRunner kikimr; + auto db = kikimr.GetTableClient(); + auto session = db.CreateSession().GetValueSync().GetSession(); + + auto params = TParamsBuilder() + .AddParam("$key").Uint64(1).Build() + .AddParam("$value").Uint64(2).Build() + .Build(); + + TExecDataQuerySettings settings; + auto req = session.ExecuteDataQuery(Q_(R"( + DECLARE $key AS Uint64; + DECLARE $value AS Uint64; + + REPLACE INTO `KeyValue` + (Key, Value) + VALUES + ($key, $value); + )"), TTxControl::BeginTx().CommitTx(), params).ExtractValueSync(); + + req.GetIssues().PrintTo(Cerr); + UNIT_ASSERT_VALUES_EQUAL(req.GetStatus(), EStatus::GENERIC_ERROR); + UNIT_ASSERT_STRING_CONTAINS(req.GetIssues().ToString(), "Failed to convert 'Value': Uint64 to Optional<String>"); + } } } // namespace NKqp diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp index b8a00d753b..efd5160faa 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.cpp +++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp @@ -385,6 +385,8 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr& TExprNode::TPtr field; if (!pos) { if (newField->GetItemType()->GetKind() != ETypeAnnotationKind::Optional) { + ctx.AddError(TIssue(node->Pos(ctx), TStringBuilder() << + "Can't find '" << newField->GetName() << "': " << *newField->GetItemType() << " in " << sourceType)); return IGraphTransformer::TStatus::Error; } @@ -406,6 +408,8 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr& YQL_ENSURE(field); auto status = TryConvertToImpl(ctx, field, *oldType->GetItemType(), *newField->GetItemType(), flags); if (status.Level == IGraphTransformer::TStatus::Error) { + ctx.AddError(TIssue(node->Pos(ctx), TStringBuilder() << + "Failed to convert '" << newField->GetName() << "': " << *oldType->GetItemType() << " to " << *newField->GetItemType())); return status; } } @@ -447,6 +451,8 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr& .Seal() .Build(); } else { + ctx.AddError(TIssue(node->Pos(ctx), TStringBuilder() << + "Can't find '" << newField->GetName() << "': " << *newField->GetItemType() << " in " << sourceType)); return IGraphTransformer::TStatus::Error; } } else { @@ -461,6 +467,8 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr& auto status = TryConvertToImpl(ctx, field, *oldType->GetItemType(), *newField->GetItemType(), flags); if (status.Level == IGraphTransformer::TStatus::Error) { + ctx.AddError(TIssue(node->Pos(ctx), TStringBuilder() << + "Failed to convert '" << newField->GetName() << "': " << *oldType->GetItemType() << " to " << *newField->GetItemType())); return status; } } @@ -3399,12 +3407,14 @@ IGraphTransformer::TStatus TryConvertTo(TExprNode::TPtr& node, const TTypeAnnota return IGraphTransformer::TStatus::Error; } + TIssueScopeGuard guard(ctx.IssueManager, [&] { + return MakeIntrusive<TIssue>(ctx.GetPosition(node->Pos()), + TStringBuilder() << "Failed to convert type: " << sourceType << " to " << expectedType); + }); auto status = TryConvertToImpl(ctx, node, sourceType, expectedType, flags); - if (status.Level == IGraphTransformer::TStatus::Error) { - ctx.AddError(TIssue(ctx.GetPosition(node->Pos()), TStringBuilder() << "Failed to convert type: " << - sourceType << " to " << expectedType)); + if (status.Level == IGraphTransformer::TStatus::Error) { + guard.MakeIssueForEmptyScope(); } - return status; } diff --git a/ydb/library/yql/public/issue/yql_issue_manager.cpp b/ydb/library/yql/public/issue/yql_issue_manager.cpp index 7375d2d30f..b5912fabd7 100644 --- a/ydb/library/yql/public/issue/yql_issue_manager.cpp +++ b/ydb/library/yql/public/issue/yql_issue_manager.cpp @@ -50,6 +50,18 @@ void TIssueManager::LeaveScope() { } } RawIssues_.pop(); + MakeIssueForEmptyScope(); + + if (subIssue->GetCode() == Max<ui32>()) { + for (const auto& nestedIssue : subIssue->GetSubIssues()) { + RawIssues_.top().first->Get()->AddSubIssue(nestedIssue); + } + } else { + RawIssues_.top().first->Get()->AddSubIssue(subIssue); + } +} + +void TIssueManager::MakeIssueForEmptyScope() { if (RawIssues_.top().first.Empty()) { RawIssues_.top().first = RawIssues_.top().second(); if (!*RawIssues_.top().first) { @@ -59,14 +71,6 @@ void TIssueManager::LeaveScope() { (*RawIssues_.top().first)->Severity = ESeverity::TSeverityIds_ESeverityId_S_INFO; } } - - if (subIssue->GetCode() == Max<ui32>()) { - for (const auto& nestedIssue : subIssue->GetSubIssues()) { - RawIssues_.top().first->Get()->AddSubIssue(nestedIssue); - } - } else { - RawIssues_.top().first->Get()->AddSubIssue(subIssue); - } } void TIssueManager::LeaveAllScopes() { @@ -103,15 +107,7 @@ void TIssueManager::RaiseIssue(const TIssue& issue) { CompletedIssues_.AddIssue(issue); return; } - if (RawIssues_.top().first.Empty()) { - RawIssues_.top().first = RawIssues_.top().second(); - if (!*RawIssues_.top().first) { - RawIssues_.top().first = new TIssue(); - (*RawIssues_.top().first)->SetCode(Max<ui32>(), ESeverity::TSeverityIds_ESeverityId_S_INFO); - } else { - (*RawIssues_.top().first)->Severity = ESeverity::TSeverityIds_ESeverityId_S_INFO; - } - } + MakeIssueForEmptyScope(); RawIssues_.top().first->Get()->AddSubIssue(p); } diff --git a/ydb/library/yql/public/issue/yql_issue_manager.h b/ydb/library/yql/public/issue/yql_issue_manager.h index 9ad5ac7bb4..e0d831a58a 100644 --- a/ydb/library/yql/public/issue/yql_issue_manager.h +++ b/ydb/library/yql/public/issue/yql_issue_manager.h @@ -36,6 +36,8 @@ public: IssueLimit_ = limit; } + void MakeIssueForEmptyScope(); + private: TIssuePtr CheckUniqAndLimit(const TIssue& issue); @@ -66,6 +68,11 @@ public: { Manager_.AddScope(fn); } + + void MakeIssueForEmptyScope() { + Manager_.MakeIssueForEmptyScope(); + } + ~TIssueScopeGuard() { Manager_.LeaveScope(); diff --git a/ydb/services/ydb/ydb_table_ut.cpp b/ydb/services/ydb/ydb_table_ut.cpp index c5854ec7be..de43ed56e2 100644 --- a/ydb/services/ydb/ydb_table_ut.cpp +++ b/ydb/services/ydb/ydb_table_ut.cpp @@ -197,6 +197,7 @@ Y_UNIT_TEST_SUITE(YdbYqlClient) { auto ref = R"___(<main>: Error: Type annotation, code: 1030 <main>:2:25: Error: At function: KiWriteTable! <main>:2:43: Error: Failed to convert type: Struct<'Key':String,'Value':String> to Struct<'Key':Uint32?,'Value':String?> + <main>:2:43: Error: Failed to convert 'Key': String to Optional<Uint32> <main>:2:43: Error: Failed to convert input columns types to scheme types, code: 2031 )___"; UNIT_ASSERT_EQUAL(result.GetIssues().Size(), 1); |