diff options
author | udovichenko-r <[email protected]> | 2025-08-21 16:27:18 +0300 |
---|---|---|
committer | udovichenko-r <[email protected]> | 2025-08-21 17:07:33 +0300 |
commit | 7fcf0e3315a1e498f8de24f2eeec8c7409182d19 (patch) | |
tree | 3a3714ab1c44a2a24dcd059bbacad7b39630b71e | |
parent | 491fbcb0db8a5ea03313b257554eb49730e86d20 (diff) |
Fix Sorted constraint for UnionMerge when the one of inputs is empty
commit_hash:1a6c8ea1c65a438f8801f4f71f6d1bcb15a95c81
-rw-r--r-- | yql/essentials/ast/yql_constraint.cpp | 6 | ||||
-rw-r--r-- | yql/essentials/core/ut/yql_expr_constraint_ut.cpp | 27 |
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)) |