diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-06-29 16:06:10 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-06-29 16:06:10 +0300 |
commit | 6ce465c47be67ef9583bebf1c1d53742ccf2db18 (patch) | |
tree | 893201600b8eadbbd2e539e268da603c0da74a90 | |
parent | 10e7cfb0b633f154ca03f8dbc17560fc7d65fd28 (diff) | |
download | ydb-6ce465c47be67ef9583bebf1c1d53742ccf2db18.tar.gz |
YQL-8971 YQL-15555 Fix check unique constraints by join keys.
-rw-r--r-- | ydb/library/yql/ast/yql_constraint.cpp | 14 | ||||
-rw-r--r-- | ydb/library/yql/ast/yql_constraint.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_constraint.cpp | 6 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_join.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/providers/dq/provider/yql_dq_datasink_constraints.cpp | 4 |
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()) { |