diff options
author | a-romanov <[email protected]> | 2023-04-20 11:16:31 +0300 |
---|---|---|
committer | a-romanov <[email protected]> | 2023-04-20 11:16:31 +0300 |
commit | 2672c24d6319d55249f681a26eb9acd8d779084d (patch) | |
tree | 498635355978378a833807d6cd1b1bf87c1a7613 | |
parent | 13a5d53d87894bc1bc7f499695e759743d459587 (diff) |
YQL-8971 YQL-15435 Fix KeepUnique for multi set case.
-rw-r--r-- | ydb/library/yql/core/yql_opt_utils.cpp | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/ydb/library/yql/core/yql_opt_utils.cpp b/ydb/library/yql/core/yql_opt_utils.cpp index 764d1432d7d..9c65d371f38 100644 --- a/ydb/library/yql/core/yql_opt_utils.cpp +++ b/ydb/library/yql/core/yql_opt_utils.cpp @@ -22,22 +22,18 @@ namespace { template<bool Distinct> TExprNode::TPtr KeepUniqueConstraint(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx) { if (const auto uniq = src.GetConstraint<TUniqueConstraintNodeBase<Distinct>>()) { - TExprNode::TListType columns; - for (const auto& set : uniq->GetAllSets()) + const auto pos = node->Pos(); + TExprNode::TListType children(1U, std::move(node)); + for (const auto& set : uniq->GetAllSets()) { + TExprNode::TListType columns; + columns.reserve(set.size()); for (const auto& path : set) - if (!path.empty()) - columns.emplace_back(ctx.NewAtom(node->Pos(), path.front())); - const auto& name = std::conditional_t<Distinct, TCoAssumeDistinct, TCoAssumeUnique>::CallableName(); - return columns.empty() ? - ctx.NewCallable(node->Pos(), name, {std::move(node)}): - ctx.Builder(node->Pos()) - .Callable(name) - .Add(0, std::move(node)) - .List(1) - .Add(std::move(columns)) - .Seal() - .Seal() - .Build(); + if (1U == path.size()) + columns.emplace_back(ctx.NewAtom(pos, path.front())); + if (!columns.empty()) + children.emplace_back(ctx.NewList(pos, std::move(columns))); + } + return ctx.NewCallable(pos, std::conditional_t<Distinct, TCoAssumeDistinct, TCoAssumeUnique>::CallableName(), std::move(children)); } return node; } |