summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <[email protected]>2023-04-20 11:16:31 +0300
committera-romanov <[email protected]>2023-04-20 11:16:31 +0300
commit2672c24d6319d55249f681a26eb9acd8d779084d (patch)
tree498635355978378a833807d6cd1b1bf87c1a7613
parent13a5d53d87894bc1bc7f499695e759743d459587 (diff)
YQL-8971 YQL-15435 Fix KeepUnique for multi set case.
-rw-r--r--ydb/library/yql/core/yql_opt_utils.cpp26
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;
}