summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorudovichenko-r <[email protected]>2025-08-21 16:27:18 +0300
committerudovichenko-r <[email protected]>2025-08-21 17:07:33 +0300
commit7fcf0e3315a1e498f8de24f2eeec8c7409182d19 (patch)
tree3a3714ab1c44a2a24dcd059bbacad7b39630b71e
parent491fbcb0db8a5ea03313b257554eb49730e86d20 (diff)
Fix Sorted constraint for UnionMerge when the one of inputs is empty
commit_hash:1a6c8ea1c65a438f8801f4f71f6d1bcb15a95c81
-rw-r--r--yql/essentials/ast/yql_constraint.cpp6
-rw-r--r--yql/essentials/core/ut/yql_expr_constraint_ut.cpp27
2 files changed, 31 insertions, 2 deletions
diff --git a/yql/essentials/ast/yql_constraint.cpp b/yql/essentials/ast/yql_constraint.cpp
index 54ef1f44916..b19bf96c98a 100644
--- a/yql/essentials/ast/yql_constraint.cpp
+++ b/yql/essentials/ast/yql_constraint.cpp
@@ -444,7 +444,9 @@ const TSortedConstraintNode* TSortedConstraintNode::MakeCommon(const std::vector
std::optional<TContainerType> content;
for (size_t i = 0U; i < constraints.size(); ++i) {
- if (const auto sort = constraints[i]->GetConstraint<TSortedConstraintNode>()) {
+ if (constraints[i]->GetConstraint<TEmptyConstraintNode>()) {
+ ; // just ignore this input with any other constraints
+ } else if (const auto sort = constraints[i]->GetConstraint<TSortedConstraintNode>()) {
const auto& nextContent = sort->GetContent();
if (content) {
const auto size = std::min(content->size(), nextContent.size());
@@ -466,7 +468,7 @@ const TSortedConstraintNode* TSortedConstraintNode::MakeCommon(const std::vector
} else {
content = nextContent;
}
- } else if (!constraints[i]->GetConstraint<TEmptyConstraintNode>()) {
+ } else {
content.reset();
break;
}
diff --git a/yql/essentials/core/ut/yql_expr_constraint_ut.cpp b/yql/essentials/core/ut/yql_expr_constraint_ut.cpp
index 981776d3ccd..d2fec272397 100644
--- a/yql/essentials/core/ut/yql_expr_constraint_ut.cpp
+++ b/yql/essentials/core/ut/yql_expr_constraint_ut.cpp
@@ -674,6 +674,33 @@ Y_UNIT_TEST_SUITE(TYqlExprConstraints) {
CheckConstraint<TSortedConstraintNode>(exprRoot, "UnionMerge", "Sorted(key[desc])");
}
+ Y_UNIT_TEST(UnionMergeWithEmptyDiffSort) {
+ const auto s = R"((
+ (let res (DataSink 'result))
+ (let list1 (AsList
+ (AsStruct '('key (String '4)) '('subkey (String 'c)) '('value (String 'v)))
+ (AsStruct '('key (String '1)) '('subkey (String 'd)) '('value (String 'v)))
+ (AsStruct '('key (String '3)) '('subkey (String 'b)) '('value (String 'v)))
+ ))
+ (let list2 (AsList
+ (AsStruct '('key (String '4)) '('subkey (Utf8 'c)) '('value (String 'v)))
+ (AsStruct '('key (String '1)) '('subkey (Utf8 'd)) '('value (String 'v)))
+ (AsStruct '('key (String '3)) '('subkey (Utf8 'b)) '('value (String 'v)))
+ ))
+ (let sorted1 (Sort list1 (Bool 'True) (lambda '(item) (Member item 'key))))
+ (let sorted2 (Sort list2 (Bool 'True) (lambda '(item) (Member item 'value))))
+ (let sorted2 (Take sorted2 (Uint64 '0)))
+ (let merged (UnionMerge sorted1 sorted2))
+ (let world (Write! world res (Key) merged '()))
+ (let world (Commit! world res))
+ (return world)
+ ))";
+
+ TExprContext exprCtx;
+ const auto exprRoot = ParseAndAnnotate(s, exprCtx);
+ CheckConstraint<TSortedConstraintNode>(exprRoot, "UnionMerge", "Sorted(key[asc])");
+ }
+
Y_UNIT_TEST(ExtractMembersKey) {
const auto s = R"((
(let res (DataSink 'result))