diff options
| author | udovichenko-r <[email protected]> | 2025-04-15 17:28:58 +0300 | 
|---|---|---|
| committer | udovichenko-r <[email protected]> | 2025-04-15 17:45:25 +0300 | 
| commit | 218ec6a31e4d1f39811692f17f54a77a5755ee4c (patch) | |
| tree | 88ee82921c61e9cc2a15d0e4d0040b446113715e | |
| parent | a004c2e3c2279e8f31e98d74ed3b7773a34a9557 (diff) | |
Check missing fields in Cast constraints calculation
commit_hash:80d14b9a81504ea3fcb8d6fa89a2472f700c0f0e
| -rw-r--r-- | yql/essentials/core/ut/yql_expr_constraint_ut.cpp | 22 | ||||
| -rw-r--r-- | yql/essentials/core/yql_expr_constraint.cpp | 12 | 
2 files changed, 31 insertions, 3 deletions
diff --git a/yql/essentials/core/ut/yql_expr_constraint_ut.cpp b/yql/essentials/core/ut/yql_expr_constraint_ut.cpp index 45d9f6285de..a4145b9c5a8 100644 --- a/yql/essentials/core/ut/yql_expr_constraint_ut.cpp +++ b/yql/essentials/core/ut/yql_expr_constraint_ut.cpp @@ -1124,6 +1124,28 @@ Y_UNIT_TEST_SUITE(TYqlExprConstraints) {          CheckConstraint<TUniqueConstraintNode>(exprRoot, "LazyList", "Unique((one,{two,xxx},yyy))");      } +    Y_UNIT_TEST(UniqueNarrowCast) { +        const auto s = R"(( +            (let res (DataSink 'result)) +            (let list (AsList +                (AsStruct '('key (String '4)) '('subkey (String 'c)) '('value (String 'x))) +                (AsStruct '('key (String '1)) '('subkey (String 'b)) '('value (String 'y))) +                (AsStruct '('key (String '4)) '('subkey (String 'b)) '('value (String 'z))) +            )) +            (let list (AssumeUnique list '('key 'subkey))) +            (let list (Map list (lambda '(item) +                (SafeCast item (StructType '('key (DataType 'String)) '('value (DataType 'String)))) +            ))) +            (let world (Write! world res (Key) list '())) +            (let world (Commit! world res)) +            (return world) +        ))"; + +        TExprContext exprCtx; +        const auto exprRoot = ParseAndAnnotate(s, exprCtx); +        CheckConstraint<TUniqueConstraintNode>(exprRoot, "Map", ""); +    } +      Y_UNIT_TEST(Distinct) {          const auto s = R"((      (let res (DataSink 'result)) diff --git a/yql/essentials/core/yql_expr_constraint.cpp b/yql/essentials/core/yql_expr_constraint.cpp index fdfc21946be..e67557d9645 100644 --- a/yql/essentials/core/yql_expr_constraint.cpp +++ b/yql/essentials/core/yql_expr_constraint.cpp @@ -665,12 +665,18 @@ private:          };          const auto filterForUnique = [inItemType, outItemType](const TPartOfConstraintBase::TPathType& path) { -            const auto castResult = CastResult<Strict>(TPartOfConstraintBase::GetSubTypeByPath(path, *inItemType), TPartOfConstraintBase::GetSubTypeByPath(path, *outItemType)); -            return NUdf::ECastOptions::Complete == castResult || NUdf::ECastOptions::MayFail == castResult; +            if (const auto outType = TPartOfConstraintBase::GetSubTypeByPath(path, *outItemType)) { +                const auto castResult = CastResult<Strict>(TPartOfConstraintBase::GetSubTypeByPath(path, *inItemType), outType); +                return NUdf::ECastOptions::Complete == castResult || NUdf::ECastOptions::MayFail == castResult; +            } +            return false;          };          const auto filterForDistinct = [inItemType, outItemType](const TPartOfConstraintBase::TPathType& path) { -            return NUdf::ECastOptions::Complete == CastResult<Strict>(TPartOfConstraintBase::GetSubTypeByPath(path, *inItemType), TPartOfConstraintBase::GetSubTypeByPath(path, *outItemType)); +            if (const auto outType = TPartOfConstraintBase::GetSubTypeByPath(path, *outItemType)) { +                return NUdf::ECastOptions::Complete == CastResult<Strict>(TPartOfConstraintBase::GetSubTypeByPath(path, *inItemType), outType); +            } +            return false;          };          FilterFromHead<TSortedConstraintNode>(input, filter, ctx);  | 
