aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-06-29 16:06:10 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-06-29 16:06:10 +0300
commit6ce465c47be67ef9583bebf1c1d53742ccf2db18 (patch)
tree893201600b8eadbbd2e539e268da603c0da74a90
parent10e7cfb0b633f154ca03f8dbc17560fc7d65fd28 (diff)
downloadydb-6ce465c47be67ef9583bebf1c1d53742ccf2db18.tar.gz
YQL-8971 YQL-15555 Fix check unique constraints by join keys.
-rw-r--r--ydb/library/yql/ast/yql_constraint.cpp14
-rw-r--r--ydb/library/yql/ast/yql_constraint.h2
-rw-r--r--ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp4
-rw-r--r--ydb/library/yql/core/yql_expr_constraint.cpp6
-rw-r--r--ydb/library/yql/core/yql_join.cpp4
-rw-r--r--ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp4
6 files changed, 13 insertions, 21 deletions
diff --git a/ydb/library/yql/ast/yql_constraint.cpp b/ydb/library/yql/ast/yql_constraint.cpp
index 5fdef54d18f..b6546877427 100644
--- a/ydb/library/yql/ast/yql_constraint.cpp
+++ b/ydb/library/yql/ast/yql_constraint.cpp
@@ -834,22 +834,14 @@ bool TUniqueConstraintNodeBase<Distinct>::IsOrderBy(const TSortedConstraintNode&
}
template<bool Distinct>
-bool TUniqueConstraintNodeBase<Distinct>::HasEqualColumns(const std::vector<std::string_view>& columns) const {
+bool TUniqueConstraintNodeBase<Distinct>::ContainsCompleteSet(const std::vector<std::string_view>& columns) const {
if (columns.empty())
return false;
const std::unordered_set<std::string_view> ordered(columns.cbegin(), columns.cend());
- std::unordered_set<std::string_view> uniques(columns.size());
for (const auto& set : Sets_) {
- if (std::all_of(set.cbegin(), set.cend(), [&ordered](const TPathType& path) { return !path.empty() && ordered.contains(path.front()); })) {
- for (const auto& path : set) {
- if (!path.empty()) {
- uniques.emplace(path.front());
- }
- }
- if (uniques.size() == ordered.size())
- return true;
- }
+ if (std::all_of(set.cbegin(), set.cend(), [&ordered](const TPathType& path) { return !path.empty() && ordered.contains(path.front()); }))
+ return true;
}
return false;
}
diff --git a/ydb/library/yql/ast/yql_constraint.h b/ydb/library/yql/ast/yql_constraint.h
index f17a9f1acab..46bc77afb55 100644
--- a/ydb/library/yql/ast/yql_constraint.h
+++ b/ydb/library/yql/ast/yql_constraint.h
@@ -253,7 +253,7 @@ public:
void ToJson(NJson::TJsonWriter& out) const override;
bool IsOrderBy(const TSortedConstraintNode& sorted) const;
- bool HasEqualColumns(const std::vector<std::string_view>& columns) const;
+ bool ContainsCompleteSet(const std::vector<std::string_view>& columns) const;
void FilterUncompleteReferences(TSetType& references) const;
diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
index 8032be02c0e..73c5cdae18e 100644
--- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
+++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp
@@ -440,8 +440,8 @@ TExprNode::TPtr ExpandEquiJoinImpl(const TExprNode& node, TExprContext& ctx) {
const auto lUnique = list1->GetConstraint<TUniqueConstraintNode>();
const auto rUnique = list2->GetConstraint<TUniqueConstraintNode>();
- const bool uniqueLeft = lUnique && lUnique->HasEqualColumns(lKeys) || linkSettings.LeftHints.contains("unique") || linkSettings.LeftHints.contains("any");
- const bool uniqueRight = rUnique && rUnique->HasEqualColumns(rKeys) || linkSettings.RightHints.contains("unique") || linkSettings.RightHints.contains("any");
+ const bool uniqueLeft = lUnique && lUnique->ContainsCompleteSet(lKeys) || linkSettings.LeftHints.contains("unique") || linkSettings.LeftHints.contains("any");
+ const bool uniqueRight = rUnique && rUnique->ContainsCompleteSet(rKeys) || linkSettings.RightHints.contains("unique") || linkSettings.RightHints.contains("any");
TExprNode::TListType flags;
if (uniqueLeft)
diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp
index 6a17cf349dc..29b46cee571 100644
--- a/ydb/library/yql/core/yql_expr_constraint.cpp
+++ b/ydb/library/yql/core/yql_expr_constraint.cpp
@@ -2366,7 +2366,7 @@ private:
input->AddConstraint(renamed);
} else {
if (const auto unique = core.LeftInput().Ref().GetConstraint<TUniqueConstraintNode>()) {
- if (unique->HasEqualColumns(GetKeys(core.LeftKeysColumns().Ref())) && core.RightDict().Ref().GetTypeAnn()->Cast<TDictExprType>()->GetPayloadType()->GetKind() != ETypeAnnotationKind::List) {
+ if (unique->ContainsCompleteSet(GetKeys(core.LeftKeysColumns().Ref())) && core.RightDict().Ref().GetTypeAnn()->Cast<TDictExprType>()->GetPayloadType()->GetKind() != ETypeAnnotationKind::List) {
const auto rename = GetRenames(core.LeftRenames().Ref());
const auto rightRename = GetRenames<true>(core.RightRenames().Ref());
auto commonUnique = unique->RenameFields(ctx, rename);
@@ -2425,8 +2425,8 @@ private:
const auto lUnique = core.LeftInput().Ref().GetConstraint<TUniqueConstraintNode>();
const auto rUnique = core.RightInput().Ref().GetConstraint<TUniqueConstraintNode>();
- const bool lOneRow = lUnique && (leftAny || lUnique->HasEqualColumns(GetKeys(core.LeftKeysColumns().Ref())));
- const bool rOneRow = rUnique && (rigthAny || rUnique->HasEqualColumns(GetKeys(core.RightKeysColumns().Ref())));
+ const bool lOneRow = lUnique && (leftAny || lUnique->ContainsCompleteSet(GetKeys(core.LeftKeysColumns().Ref())));
+ const bool rOneRow = rUnique && (rigthAny || rUnique->ContainsCompleteSet(GetKeys(core.RightKeysColumns().Ref())));
const bool singleSide = joinType.Content().ends_with("Semi") || joinType.Content().ends_with("Only");
diff --git a/ydb/library/yql/core/yql_join.cpp b/ydb/library/yql/core/yql_join.cpp
index 109c7ec0c2b..c1e45629888 100644
--- a/ydb/library/yql/core/yql_join.cpp
+++ b/ydb/library/yql/core/yql_join.cpp
@@ -337,8 +337,8 @@ namespace {
const bool lAny = leftHints && (leftHints->contains("unique") || leftHints->contains("any"));
const bool rAny = rightHints && (rightHints->contains("unique") || rightHints->contains("any"));
- const bool lOneRow = lAny || lUnique && lUnique->HasEqualColumns(lCheck);
- const bool rOneRow = rAny || rUnique && rUnique->HasEqualColumns(rCheck);
+ const bool lOneRow = lAny || lUnique && lUnique->ContainsCompleteSet(lCheck);
+ const bool rOneRow = rAny || rUnique && rUnique->ContainsCompleteSet(rCheck);
if (unique) {
if (singleSide) {
diff --git a/ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp b/ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp
index f601c60e5f0..90fd45c61b9 100644
--- a/ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp
+++ b/ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp
@@ -185,8 +185,8 @@ public:
const bool leftSide = joinType.Content().starts_with("Left");
const bool rightSide = joinType.Content().starts_with("Right");
- const bool lOneRow = leftAny || lUnique && lUnique->HasEqualColumns(leftJoinKeys);
- const bool rOneRow = rightAny || rUnique && rUnique->HasEqualColumns(rightJoinKeys);
+ const bool lOneRow = leftAny || lUnique && lUnique->ContainsCompleteSet(leftJoinKeys);
+ const bool rOneRow = rightAny || rUnique && rUnique->ContainsCompleteSet(rightJoinKeys);
const auto makeRename = [&ctx](const TExprBase& label) -> TConstraintNode::TPathReduce {
if (label.Ref().IsAtom()) {