summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-09-08 14:17:09 +0300
committervvvv <[email protected]>2025-09-08 14:54:46 +0300
commit06b6c5938dc5f1cdf3913daa295dc5f04daee305 (patch)
tree06558fd8639253aa673bd9f0b9c675a8fa1cb4bf
parent8733bea995aa241e78baff8762032ac6a2468be6 (diff)
YQL-20258 more tests & refactor
commit_hash:031b3f5c4215bc9c66d0cea9c8dd8d69a1ec1627
-rw-r--r--yql/essentials/core/common_opt/yql_co_simple1.cpp53
-rw-r--r--yql/essentials/core/common_opt/yql_co_simple2.cpp5
-rw-r--r--yql/essentials/core/common_opt/yql_flatmap_over_join.cpp2
-rw-r--r--yql/essentials/core/yql_opt_utils.cpp8
-rw-r--r--yql/essentials/core/yql_opt_utils.h1
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/result.json12
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_side_effects-equal_same_/formatted.sql8
-rw-r--r--yql/essentials/tests/sql/suites/side_effects/equal_same.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/side_effects/equal_same.yql5
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;