aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Surin <surinmike@gmail.com>2022-05-26 01:02:29 +0300
committerMikhail Surin <surinmike@gmail.com>2022-05-26 01:02:29 +0300
commitc54cc66e2e56565533785cfe3451e8bfb0a596ac (patch)
treef75a51e9b4b68ac529d4a06c71bc4f97e8ddfca0
parent72ceb2e642827dac9a4fc15a48a0b2e17642ae17 (diff)
downloadydb-c54cc66e2e56565533785cfe3451e8bfb0a596ac.tar.gz
Add column name in error message
ref:1e63a8981aca91fb4ad97b26947534d14b0c1fd3
-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.h8
-rw-r--r--ydb/services/ydb/ydb_table_ut.cpp1
5 files changed, 72 insertions, 11 deletions
diff --git a/ydb/core/kqp/ut/kqp_yql_ut.cpp b/ydb/core/kqp/ut/kqp_yql_ut.cpp
index 67b87ea3060..616fc91aa7f 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 b8a00d753b4..06d1c254493 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.RaiseIssueForEmptyScope();
}
-
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 7375d2d30f0..08daf0fcdd0 100644
--- a/ydb/library/yql/public/issue/yql_issue_manager.cpp
+++ b/ydb/library/yql/public/issue/yql_issue_manager.cpp
@@ -69,29 +69,45 @@ void TIssueManager::LeaveScope() {
}
}
+void TIssueManager::RaiseIssueForEmptyScope() {
+ if (RawIssues_.top().first.Empty()) {
+ TIssuePtr materialized = RawIssues_.top().second();
+ if (auto p = CheckUniqAndLimit(materialized)) {
+ RawIssues_.top().first = p;
+ }
+ }
+}
+
void TIssueManager::LeaveAllScopes() {
while (!RawIssues_.empty()) {
LeaveScope();
}
}
-TIssuePtr TIssueManager::CheckUniqAndLimit(const TIssue& issue) {
- const auto severity = issue.GetSeverity();
+TIssuePtr TIssueManager::CheckUniqAndLimit(TIssuePtr issue) {
+ const auto severity = issue->GetSeverity();
if (OverflowIssues_[severity]) {
return {};
}
- TIssuePtr p = MakeIntrusive<TIssue>(issue);
- if (UniqueIssues_[severity].contains(p)) {
+ if (UniqueIssues_[severity].contains(issue)) {
return {};
}
if (IssueLimit_ && UniqueIssues_[severity].size() == IssueLimit_) {
OverflowIssues_[severity] = MakeIntrusive<TIssue>(TStringBuilder()
- << "Too many " << SeverityToString(issue.GetSeverity()) << " issues");
+ << "Too many " << SeverityToString(issue->GetSeverity()) << " issues");
OverflowIssues_[severity]->Severity = severity;
return {};
}
- UniqueIssues_[severity].insert(p);
- return p;
+ UniqueIssues_[severity].insert(issue);
+ return issue;
+}
+
+TIssuePtr TIssueManager::CheckUniqAndLimit(const TIssue& issue) {
+ const auto severity = issue.GetSeverity();
+ if (OverflowIssues_[severity]) {
+ return {};
+ }
+ return CheckUniqAndLimit(MakeIntrusive<TIssue>(issue));
}
void TIssueManager::RaiseIssue(const TIssue& issue) {
diff --git a/ydb/library/yql/public/issue/yql_issue_manager.h b/ydb/library/yql/public/issue/yql_issue_manager.h
index 9ad5ac7bb40..d9ab4a2821f 100644
--- a/ydb/library/yql/public/issue/yql_issue_manager.h
+++ b/ydb/library/yql/public/issue/yql_issue_manager.h
@@ -36,8 +36,11 @@ public:
IssueLimit_ = limit;
}
+ void RaiseIssueForEmptyScope();
+
private:
TIssuePtr CheckUniqAndLimit(const TIssue& issue);
+ TIssuePtr CheckUniqAndLimit(TIssuePtr issue);
struct TIssueHash {
ui64 operator()(const TIssuePtr& p) {
@@ -66,6 +69,11 @@ public:
{
Manager_.AddScope(fn);
}
+
+ void RaiseIssueForEmptyScope() {
+ Manager_.RaiseIssueForEmptyScope();
+ }
+
~TIssueScopeGuard()
{
Manager_.LeaveScope();
diff --git a/ydb/services/ydb/ydb_table_ut.cpp b/ydb/services/ydb/ydb_table_ut.cpp
index c5854ec7bec..de43ed56e24 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);