summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <[email protected]>2025-06-09 12:02:05 +0300
committeraneporada <[email protected]>2025-06-09 12:19:47 +0300
commit74bfd43caa67a648e551e77fd740e24c3ee151cb (patch)
tree12d4860c2f2651f31f9c2574f5a1bf771832ae58
parenta17ed1a95cd8e529af068d238d03d1faece71624 (diff)
Improve OptimizeSubsetFieldsForNodeWithMultiUsage for Optionals
commit_hash:44ab80a72c410e6d0afbb4a8cb818ce01426115e
-rw-r--r--yql/essentials/core/common_opt/yql_co_extr_members.cpp23
-rw-r--r--yql/essentials/core/common_opt/yql_co_extr_members.h7
-rw-r--r--yql/essentials/core/common_opt/yql_co_finalizers.cpp70
-rw-r--r--yql/essentials/core/common_opt/yql_co_flow2.cpp2
-rw-r--r--yql/essentials/core/common_opt/yql_co_simple1.cpp8
-rw-r--r--yql/essentials/core/yql_opt_utils.cpp23
-rw-r--r--yql/essentials/core/yql_opt_utils.h3
-rw-r--r--yql/essentials/tests/sql/minirun/part8/canondata/result.json12
8 files changed, 102 insertions, 46 deletions
diff --git a/yql/essentials/core/common_opt/yql_co_extr_members.cpp b/yql/essentials/core/common_opt/yql_co_extr_members.cpp
index 55923cde936..645304fedb0 100644
--- a/yql/essentials/core/common_opt/yql_co_extr_members.cpp
+++ b/yql/essentials/core/common_opt/yql_co_extr_members.cpp
@@ -85,7 +85,9 @@ TExprNode::TPtr ApplyExtractMembersToSkipNullMembers(const TExprNode::TPtr& node
.Done().Ptr();
}
-TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix) {
+TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx,
+ TOptimizeContext& optCtx, TStringBuf logSuffix)
+{
TCoFilterNullMembers filterNullMembers(node);
if (!filterNullMembers.Input().Maybe<TCoAssumeAllMembersNullableAtOnce>()) {
return {};
@@ -154,13 +156,19 @@ TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& no
YQL_CLOG(DEBUG, Core) << "Move ExtractMembers over " << node->Content() << logSuffix;
+ static const char optName[] = "MemberNthOverFlatMap";
+ YQL_ENSURE(optCtx.Types);
+ const bool keepAssume = !IsOptimizerDisabled<optName>(*optCtx.Types);
+
+ auto innerExtract = Build<TCoExtractMembers>(ctx, filterNullMembers.Pos())
+ .Input(input)
+ .Members(extendedMembers ? extendedMembers : members)
+ .Done().Ptr();
+
if (extendedMembers) {
return Build<TCoExtractMembers>(ctx, filterNullMembers.Pos())
.Input<TCoFilterNullMembers>()
- .Input<TCoExtractMembers>()
- .Input(input)
- .Members(extendedMembers)
- .Build()
+ .Input(ctx.WrapByCallableIf(keepAssume, TCoAssumeAllMembersNullableAtOnce::CallableName(), std::move(innerExtract)))
.Members(filteredMembers)
.Build()
.Members(members)
@@ -168,10 +176,7 @@ TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& no
}
return Build<TCoFilterNullMembers>(ctx, filterNullMembers.Pos())
- .Input<TCoExtractMembers>()
- .Input(input)
- .Members(members)
- .Build()
+ .Input(ctx.WrapByCallableIf(keepAssume, TCoAssumeAllMembersNullableAtOnce::CallableName(), std::move(innerExtract)))
.Members(filteredMembers)
.Done().Ptr();
}
diff --git a/yql/essentials/core/common_opt/yql_co_extr_members.h b/yql/essentials/core/common_opt/yql_co_extr_members.h
index 467a7a9fff9..8485802422b 100644
--- a/yql/essentials/core/common_opt/yql_co_extr_members.h
+++ b/yql/essentials/core/common_opt/yql_co_extr_members.h
@@ -1,8 +1,8 @@
#pragma once
-#include <yql/essentials/core/expr_nodes/yql_expr_nodes.h>
-
#include <yql/essentials/ast/yql_expr.h>
+#include <yql/essentials/core/common_opt/yql_co.h>
+#include <yql/essentials/core/expr_nodes/yql_expr_nodes.h>
#include <util/generic/strbuf.h>
@@ -13,7 +13,8 @@ TExprNode::TPtr ApplyExtractMembersToTake(const TExprNode::TPtr& node, const TEx
TExprNode::TPtr ApplyExtractMembersToSkip(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix);
TExprNode::TPtr ApplyExtractMembersToExtend(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix);
TExprNode::TPtr ApplyExtractMembersToSkipNullMembers(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix);
-TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix);
+TExprNode::TPtr ApplyExtractMembersToFilterNullMembers(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx,
+ TOptimizeContext& optCtx, TStringBuf logSuffix);
TExprNode::TPtr ApplyExtractMembersToSortOrPruneKeys(const TExprNode::TPtr& node, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx, TStringBuf logSuffix);
TExprNode::TPtr ApplyExtractMembersToAssumeUnique(const TExprNode::TPtr& node, const TExprNode::TPtr& members, TExprContext& ctx, TStringBuf logSuffix);
TExprNode::TPtr ApplyExtractMembersToTop(const TExprNode::TPtr& node, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx, TStringBuf logSuffix);
diff --git a/yql/essentials/core/common_opt/yql_co_finalizers.cpp b/yql/essentials/core/common_opt/yql_co_finalizers.cpp
index 933b0bb9310..bcd7d0da744 100644
--- a/yql/essentials/core/common_opt/yql_co_finalizers.cpp
+++ b/yql/essentials/core/common_opt/yql_co_finalizers.cpp
@@ -326,6 +326,12 @@ bool OptimizeForUnorderedConsumers(const TExprNode::TPtr& node, TNodeOnNodeOwned
return true;
}
+bool IsFieldSubsetForOptionalsEnabled(const TOptimizeContext& optCtx) {
+ YQL_ENSURE(optCtx.Types);
+ static const char optName[] = "MemberNthOverFlatMap";
+ return !IsOptimizerDisabled<optName>(*optCtx.Types);
+}
+
}
void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
@@ -333,7 +339,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToExtend(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -343,7 +350,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToTake(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -353,7 +361,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToSkip(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -363,7 +372,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToSkipNullMembers(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -371,9 +381,10 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
map[TCoFilterNullMembers::CallableName()] = [](const TExprNode::TPtr& node, TNodeOnNodeOwnedMap& toOptimize, TExprContext& ctx, TOptimizeContext& optCtx) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
- [] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
- return ApplyExtractMembersToFilterNullMembers(input, members, ctx, " with multi-usage");
- }
+ [&] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
+ return ApplyExtractMembersToFilterNullMembers(input, members, ctx, optCtx, " with multi-usage");
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -383,7 +394,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToFlatMap(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -396,7 +408,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToSortOrPruneKeys(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -406,7 +419,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToSortOrPruneKeys(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -416,7 +430,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToAssumeUnique(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -429,7 +444,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToTop(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -439,7 +455,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[](const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToEquiJoin(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
if (!toOptimize.empty()) {
return true;
@@ -461,7 +478,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToPartitionByKey(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -474,7 +492,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToCalcOverWindow(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -484,7 +503,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToAggregate(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -494,7 +514,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToChopper(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -504,7 +525,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToCollect(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -514,7 +536,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToMapNext(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -524,7 +547,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToChain1Map(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -534,7 +558,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap& parentsMap, TExprContext& ctx) {
return ApplyExtractMembersToCondense1(input, members, parentsMap, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
@@ -544,7 +569,8 @@ void RegisterCoFinalizers(TFinalizingOptimizerMap& map) {
OptimizeSubsetFieldsForNodeWithMultiUsage(node, *optCtx.ParentsMap, toOptimize, ctx,
[] (const TExprNode::TPtr& input, const TExprNode::TPtr& members, const TParentsMap&, TExprContext& ctx) {
return ApplyExtractMembersToCombineCore(input, members, ctx, " with multi-usage");
- }
+ },
+ IsFieldSubsetForOptionalsEnabled(optCtx)
);
return true;
diff --git a/yql/essentials/core/common_opt/yql_co_flow2.cpp b/yql/essentials/core/common_opt/yql_co_flow2.cpp
index 7099574b572..c0ce99b8df3 100644
--- a/yql/essentials/core/common_opt/yql_co_flow2.cpp
+++ b/yql/essentials/core/common_opt/yql_co_flow2.cpp
@@ -2200,7 +2200,7 @@ void RegisterCoFlowCallables2(TCallableOptimizerMap& map) {
}
if (self.Input().Maybe<TCoFilterNullMembers>()) {
- if (auto res = ApplyExtractMembersToFilterNullMembers(self.Input().Ptr(), self.Members().Ptr(), ctx, {})) {
+ if (auto res = ApplyExtractMembersToFilterNullMembers(self.Input().Ptr(), self.Members().Ptr(), ctx, optCtx, {})) {
return res;
}
return node;
diff --git a/yql/essentials/core/common_opt/yql_co_simple1.cpp b/yql/essentials/core/common_opt/yql_co_simple1.cpp
index 99534916211..0df3c0746ef 100644
--- a/yql/essentials/core/common_opt/yql_co_simple1.cpp
+++ b/yql/essentials/core/common_opt/yql_co_simple1.cpp
@@ -4007,6 +4007,14 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) {
}
const auto self = TCoFilterNullMembers(node);
if (self.Members() && self.Members().Cast().Size() == 1) {
+ static const char optNameMember[] = "MemberNthOverFlatMap";
+ const bool canDropAssume = !IsOptimizerDisabled<optNameMember>(*optCtx.Types);
+ if (canDropAssume) {
+ if (auto maybeAssume = self.Input().Maybe<TCoAssumeAllMembersNullableAtOnce>()) {
+ YQL_CLOG(DEBUG, Core) << node->Content() << " with single member over " << maybeAssume.Cast().CallableName();
+ return ctx.ChangeChild(*node, TCoFilterNullMembers::idx_Input, maybeAssume.Cast().Input().Ptr());
+ }
+ }
if (auto maybeJust = self.Input().Maybe<TCoJust>()) {
YQL_CLOG(DEBUG, Core) << node->Content() << " with single member over Just";
auto name = self.Members().Cast().Item(0);
diff --git a/yql/essentials/core/yql_opt_utils.cpp b/yql/essentials/core/yql_opt_utils.cpp
index 9c40079c224..b07cc6d41e5 100644
--- a/yql/essentials/core/yql_opt_utils.cpp
+++ b/yql/essentials/core/yql_opt_utils.cpp
@@ -2060,14 +2060,20 @@ bool HasOnlyOneJoinType(const TExprNode& joinTree, TStringBuf joinType) {
void OptimizeSubsetFieldsForNodeWithMultiUsage(const TExprNode::TPtr& node, const TParentsMap& parentsMap,
TNodeOnNodeOwnedMap& toOptimize, TExprContext& ctx,
- std::function<TExprNode::TPtr(const TExprNode::TPtr&, const TExprNode::TPtr&, const TParentsMap&, TExprContext&)> handler)
+ std::function<TExprNode::TPtr(const TExprNode::TPtr&, const TExprNode::TPtr&, const TParentsMap&, TExprContext&)> handler,
+ bool withOptionals)
{
+ auto kind = node->GetTypeAnn()->GetKind();
// Ignore stream input, because it cannot be used multiple times
- if (node->GetTypeAnn()->GetKind() != ETypeAnnotationKind::List) {
+ if (!(kind == ETypeAnnotationKind::List || (withOptionals && kind == ETypeAnnotationKind::Optional))) {
return;
}
- auto itemType = node->GetTypeAnn()->Cast<TListExprType>()->GetItemType();
+
+ auto itemType = kind == ETypeAnnotationKind::Optional ?
+ node->GetTypeAnn()->Cast<TOptionalExprType>()->GetItemType() :
+ node->GetTypeAnn()->Cast<TListExprType>()->GetItemType();
+
if (itemType->GetKind() != ETypeAnnotationKind::Struct) {
return;
}
@@ -2094,6 +2100,9 @@ void OptimizeSubsetFieldsForNodeWithMultiUsage(const TExprNode::TPtr& node, cons
usedFields.insert(member.Value());
}
}
+ else if (auto maybeMember = TMaybeNode<TCoMember>(parent)) {
+ usedFields.insert(maybeMember.Cast().Name().Value());
+ }
else {
return;
}
@@ -2114,12 +2123,18 @@ void OptimizeSubsetFieldsForNodeWithMultiUsage(const TExprNode::TPtr& node, cons
for (auto parent: it->second) {
if (TCoExtractMembers::Match(parent)) {
- if (parent->GetTypeAnn()->Cast<TListExprType>()->GetItemType()->Cast<TStructExprType>()->GetSize() == usedFields.size()) {
+ auto parentItemType = kind == ETypeAnnotationKind::Optional ?
+ parent->GetTypeAnn()->Cast<TOptionalExprType>()->GetItemType() :
+ parent->GetTypeAnn()->Cast<TListExprType>()->GetItemType();
+ if (parentItemType->Cast<TStructExprType>()->GetSize() == usedFields.size()) {
toOptimize[parent] = newInput;
} else {
toOptimize[parent] = ctx.ChangeChild(*parent, 0, TExprNode::TPtr(newInput));
}
+ } else if (TCoMember::Match(parent)) {
+ toOptimize[parent] = ctx.ChangeChild(*parent, 0, TExprNode::TPtr(newInput));
} else {
+ YQL_ENSURE(TCoFlatMapBase::Match(parent));
toOptimize[parent] = ctx.Builder(parent->Pos())
.Callable(parent->Content())
.Add(0, newInput)
diff --git a/yql/essentials/core/yql_opt_utils.h b/yql/essentials/core/yql_opt_utils.h
index 3e5b2090157..196847b63d1 100644
--- a/yql/essentials/core/yql_opt_utils.h
+++ b/yql/essentials/core/yql_opt_utils.h
@@ -159,7 +159,8 @@ TExprNode::TPtr KeepWorld(TExprNode::TPtr node, const TExprNode& src, TExprConte
void OptimizeSubsetFieldsForNodeWithMultiUsage(const TExprNode::TPtr& node, const TParentsMap& parentsMap,
TNodeOnNodeOwnedMap& toOptimize, TExprContext& ctx,
- std::function<TExprNode::TPtr(const TExprNode::TPtr&, const TExprNode::TPtr&, const TParentsMap&, TExprContext&)> handler);
+ std::function<TExprNode::TPtr(const TExprNode::TPtr&, const TExprNode::TPtr&, const TParentsMap&, TExprContext&)> handler,
+ bool withOptionals = false);
template<bool Ordered = false>
std::optional<TPartOfConstraintBase::TPathType> GetPathToKey(const TExprNode& body, const TExprNode& arg);
diff --git a/yql/essentials/tests/sql/minirun/part8/canondata/result.json b/yql/essentials/tests/sql/minirun/part8/canondata/result.json
index 7d19f5f440d..b47658a25bd 100644
--- a/yql/essentials/tests/sql/minirun/part8/canondata/result.json
+++ b/yql/essentials/tests/sql/minirun/part8/canondata/result.json
@@ -966,9 +966,9 @@
],
"test.test[join-left_join_predicate_push_parent_cross_join-default.txt-Debug]": [
{
- "checksum": "f38a37ac24c103cfddd92e7f02b5fba7",
- "size": 1922,
- "uri": "https://{canondata_backend}/1917492/44c5e6988a25f07aaa25847512c1d01c959f42fd/resource.tar.gz#test.test_join-left_join_predicate_push_parent_cross_join-default.txt-Debug_/opt.yql"
+ "checksum": "23ca906191920493283354f7d5513c7a",
+ "size": 979,
+ "uri": "https://{canondata_backend}/1936273/9b381c5539d588a59b355ca473b58b39b0f90dc4/resource.tar.gz#test.test_join-left_join_predicate_push_parent_cross_join-default.txt-Debug_/opt.yql"
}
],
"test.test[join-left_join_predicate_push_parent_cross_join-default.txt-Results]": [
@@ -980,9 +980,9 @@
],
"test.test[join-yql-19731-default.txt-Debug]": [
{
- "checksum": "176315e3d36000d21b5d5b939996e7f4",
- "size": 2888,
- "uri": "https://{canondata_backend}/1937001/da1ea5a7d11a19173bf93def1ae0c375e45eef7f/resource.tar.gz#test.test_join-yql-19731-default.txt-Debug_/opt.yql"
+ "checksum": "2b80f4c474dd494dd2e83bec13d45274",
+ "size": 995,
+ "uri": "https://{canondata_backend}/1936273/9b381c5539d588a59b355ca473b58b39b0f90dc4/resource.tar.gz#test.test_join-yql-19731-default.txt-Debug_/opt.yql"
}
],
"test.test[join-yql-19731-default.txt-Results]": [