aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Surin <surinmike@gmail.com>2022-05-24 20:41:23 +0300
committerMikhail Surin <surinmike@gmail.com>2022-05-24 20:41:23 +0300
commit997a36b0da76d8e18cdd8680670aa9adbd50733f (patch)
tree42737679ef5132a3b9e373a040caa11093340fb5
parent6e003715081366d7f1440ce6b2fa3789738e5f4b (diff)
downloadydb-997a36b0da76d8e18cdd8680670aa9adbd50733f.tar.gz
Add column in type cast error message
ref:c3d3c88c18b4c105bfbceb46c3c436c9bd71129f
-rw-r--r--ydb/core/kqp/ut/kqp_yql_ut.cpp26
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp18
-rw-r--r--ydb/library/yql/public/issue/yql_issue_manager.cpp30
-rw-r--r--ydb/library/yql/public/issue/yql_issue_manager.h7
-rw-r--r--ydb/services/ydb/ydb_table_ut.cpp1
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);