diff options
author | vvvv <[email protected]> | 2025-09-08 14:17:09 +0300 |
---|---|---|
committer | vvvv <[email protected]> | 2025-09-08 14:54:46 +0300 |
commit | 06b6c5938dc5f1cdf3913daa295dc5f04daee305 (patch) | |
tree | 06558fd8639253aa673bd9f0b9c675a8fa1cb4bf | |
parent | 8733bea995aa241e78baff8762032ac6a2468be6 (diff) |
YQL-20258 more tests & refactor
commit_hash:031b3f5c4215bc9c66d0cea9c8dd8d69a1ec1627
9 files changed, 51 insertions, 44 deletions
diff --git a/yql/essentials/core/common_opt/yql_co_simple1.cpp b/yql/essentials/core/common_opt/yql_co_simple1.cpp index babfc77c5b5..77d6508e55b 100644 --- a/yql/essentials/core/common_opt/yql_co_simple1.cpp +++ b/yql/essentials/core/common_opt/yql_co_simple1.cpp @@ -3717,8 +3717,8 @@ TExprNode::TPtr ExpandSelectMembers(const TExprNode::TPtr& node, TExprContext& c UpdateStructMembers(ctx, node->HeadPtr(), ByPrefix ? "SelectMembers" : "FilterMembers", members, filterByPrefixFunc); auto res = ctx.NewCallable(node->Pos(), "AsStruct", std::move(members)); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (members.empty() && node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); + if (members.empty()) { + res = KeepSideEffects(res, node->HeadPtr(), ctx); } return res; @@ -4777,10 +4777,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { auto res = ctx.NewCallable(node->Pos(), "Uint64", { ctx.NewAtom(node->Pos(), ToString(nodeToCheck.ChildrenSize()), TNodeFlags::Default) }); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -4789,10 +4786,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { auto res = ctx.NewCallable(node->Pos(), "Uint64", { ctx.NewAtom(node->Pos(), ToString(nodeToCheck.ChildrenSize() - 1), TNodeFlags::Default) }); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -4848,10 +4842,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content(); auto res = MakeBool<true>(node->Pos(), ctx); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -4860,10 +4851,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << nodeToCheck.Content(); auto res = MakeBool(node->Pos(), nodeToCheck.ChildrenSize() > 0U, ctx); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -4871,10 +4859,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << nodeToCheck.Content(); auto res = MakeBool(node->Pos(), nodeToCheck.ChildrenSize() > 1U, ctx); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -4945,10 +4930,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content(); auto res = ExtractMember(*node); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -5007,10 +4989,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { const auto index = FromString<ui32>(node->Tail().Content()); auto res = node->Head().ChildPtr(index); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -5757,9 +5736,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content() << " - different index"; res = ctx.NewCallable(node->Pos(), "Nothing", { ExpandType(node->Pos(), *node->GetTypeAnn(), ctx) }); res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } + res = KeepSideEffects(res, node->HeadPtr(), ctx); } return res; @@ -5789,10 +5766,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { } res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res }); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } @@ -6480,10 +6454,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { } res = KeepWorld(res, *node, ctx, *optCtx.Types); - if (node->HasSideEffects()) { - res = ctx.NewCallable(node->Pos(), "Seq", { node->HeadPtr(), res}); - } - + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; }; diff --git a/yql/essentials/core/common_opt/yql_co_simple2.cpp b/yql/essentials/core/common_opt/yql_co_simple2.cpp index 31b68190d34..ee7d7819989 100644 --- a/yql/essentials/core/common_opt/yql_co_simple2.cpp +++ b/yql/essentials/core/common_opt/yql_co_simple2.cpp @@ -910,7 +910,7 @@ TExprNode::TPtr CheckIfWithSame(const TExprNode::TPtr& node, TExprContext& ctx, branches.emplace(node->Child(++i)); } - if (predicates.size() < width) { + if (!node->HasSideEffects() && predicates.size() < width) { YQL_CLOG(DEBUG, Core) << node->Content() << " with identical predicates."; auto children = node->ChildrenList(); for (auto i = 0U; i < children.size() - 1U;) { @@ -921,7 +921,7 @@ TExprNode::TPtr CheckIfWithSame(const TExprNode::TPtr& node, TExprContext& ctx, } return ctx.ChangeChildren(*node, std::move(children)); } - if (branches.size() < width) { + if (!node->HasSideEffects() && branches.size() < width) { for (auto i = 1U; i < node->ChildrenSize() - 2U; ++++i) { if (node->Child(i) == node->Child(i + 2U)) { YQL_CLOG(DEBUG, Core) << node->Content() << " with identical branches."; @@ -952,6 +952,7 @@ TExprNode::TPtr CheckCompareSame(const TExprNode::TPtr& node, TExprContext& ctx, YQL_CLOG(DEBUG, Core) << (Equal ? "Equal" : "Unequal") << " '" << node->Content() << "' with same args"; auto res = MakeBool<Equal>(node->Pos(), ctx); res = KeepWorld(res, *node, ctx, *optCtx.Types); + res = KeepSideEffects(res, node->HeadPtr(), ctx); return res; } diff --git a/yql/essentials/core/common_opt/yql_flatmap_over_join.cpp b/yql/essentials/core/common_opt/yql_flatmap_over_join.cpp index 960e72b4e7c..c8a720b2cbe 100644 --- a/yql/essentials/core/common_opt/yql_flatmap_over_join.cpp +++ b/yql/essentials/core/common_opt/yql_flatmap_over_join.cpp @@ -1945,7 +1945,7 @@ TExprBase FlatMapOverEquiJoin( .Build()); } - if (IsPredicateFlatMap(node.Lambda().Body().Ref())) { + if (!node.Raw()->HasSideEffects() && IsPredicateFlatMap(node.Lambda().Body().Ref())) { // predicate pushdown const auto& row = node.Lambda().Args().Arg(0).Ref(); auto predicate = node.Lambda().Body().Ref().ChildPtr(0); diff --git a/yql/essentials/core/yql_opt_utils.cpp b/yql/essentials/core/yql_opt_utils.cpp index 2f1b13337ed..a192590ab9f 100644 --- a/yql/essentials/core/yql_opt_utils.cpp +++ b/yql/essentials/core/yql_opt_utils.cpp @@ -2678,6 +2678,14 @@ TExprNode::TPtr KeepWorld(TExprNode::TPtr node, const TExprNode& src, TExprConte } } +TExprNode::TPtr KeepSideEffects(TExprNode::TPtr node, TExprNode::TPtr src, TExprContext& ctx) { + if (!src->HasSideEffects()) { + return node; + } + + return ctx.NewCallable(src->Pos(), "Seq", { src, node }); +} + TOperationProgress::EOpBlockStatus DetermineProgramBlockStatus(const TExprNode& root) { auto pRoot = &root; diff --git a/yql/essentials/core/yql_opt_utils.h b/yql/essentials/core/yql_opt_utils.h index 63a194b9e18..b9b3b5f28a7 100644 --- a/yql/essentials/core/yql_opt_utils.h +++ b/yql/essentials/core/yql_opt_utils.h @@ -167,6 +167,7 @@ TExprNode::TPtr KeepConstraints(TExprNode::TPtr node, const TExprNode& src, TExp TExprNode::TPtr KeepUniqueDistinct(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx); bool HasMissingWorlds(const TExprNode::TPtr& node, const TExprNode& src, const TTypeAnnotationContext& types); TExprNode::TPtr KeepWorld(TExprNode::TPtr node, const TExprNode& src, TExprContext& ctx, const TTypeAnnotationContext& types); +TExprNode::TPtr KeepSideEffects(TExprNode::TPtr node, TExprNode::TPtr src, TExprContext& ctx); void OptimizeSubsetFieldsForNodeWithMultiUsage(const TExprNode::TPtr& node, const TParentsMap& parentsMap, TNodeOnNodeOwnedMap& toOptimize, TExprContext& ctx, diff --git a/yql/essentials/tests/sql/sql2yql/canondata/result.json b/yql/essentials/tests/sql/sql2yql/canondata/result.json index 3ea2ecd4444..48fa7478aa5 100644 --- a/yql/essentials/tests/sql/sql2yql/canondata/result.json +++ b/yql/essentials/tests/sql/sql2yql/canondata/result.json @@ -7923,6 +7923,13 @@ "uri": "https://{canondata_backend}/1937150/ec0019724df75083b0e89cab22f57e10ef36744e/resource.tar.gz#test_sql2yql.test_side_effects-empty_top_/sql.yql" } ], + "test_sql2yql.test[side_effects-equal_same]": [ + { + "checksum": "01b2fb8faa4f6e13870a7734f163f767", + "size": 1202, + "uri": "https://{canondata_backend}/1784117/186b01cacb929d89a12343cbcb7b00ff658c9418/resource.tar.gz#test_sql2yql.test_side_effects-equal_same_/sql.yql" + } + ], "test_sql2yql.test[side_effects-exists]": [ { "checksum": "a1ab4e234b7b265e9c16a54843d882ce", @@ -12590,6 +12597,11 @@ "uri": "file://test_sql_format.test_side_effects-empty_top_/formatted.sql" } ], + "test_sql_format.test[side_effects-equal_same]": [ + { + "uri": "file://test_sql_format.test_side_effects-equal_same_/formatted.sql" + } + ], "test_sql_format.test[side_effects-exists]": [ { "uri": "file://test_sql_format.test_side_effects-exists_/formatted.sql" diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_side_effects-equal_same_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_side_effects-equal_same_/formatted.sql new file mode 100644 index 00000000000..73c2d64224c --- /dev/null +++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_side_effects-equal_same_/formatted.sql @@ -0,0 +1,8 @@ +/* custom error: Condition violated */ +PRAGMA warning('disable', '4510'); + +$t = Yql::WithSideEffectsMode(Ensure(TRUE, FALSE), AsAtom('General')); + +SELECT + $t == $t +; diff --git a/yql/essentials/tests/sql/suites/side_effects/equal_same.cfg b/yql/essentials/tests/sql/suites/side_effects/equal_same.cfg new file mode 100644 index 00000000000..5dae597903c --- /dev/null +++ b/yql/essentials/tests/sql/suites/side_effects/equal_same.cfg @@ -0,0 +1 @@ +xfail diff --git a/yql/essentials/tests/sql/suites/side_effects/equal_same.yql b/yql/essentials/tests/sql/suites/side_effects/equal_same.yql new file mode 100644 index 00000000000..ae44da8ea4e --- /dev/null +++ b/yql/essentials/tests/sql/suites/side_effects/equal_same.yql @@ -0,0 +1,5 @@ +/* custom error: Condition violated */ +pragma warning("disable","4510"); + +$t = Yql::WithSideEffectsMode(Ensure(true,false), AsAtom('General')); +select $t == $t; |