diff options
| author | aneporada <[email protected]> | 2025-06-09 12:02:05 +0300 |
|---|---|---|
| committer | aneporada <[email protected]> | 2025-06-09 12:19:47 +0300 |
| commit | 74bfd43caa67a648e551e77fd740e24c3ee151cb (patch) | |
| tree | 12d4860c2f2651f31f9c2574f5a1bf771832ae58 | |
| parent | a17ed1a95cd8e529af068d238d03d1faece71624 (diff) | |
Improve OptimizeSubsetFieldsForNodeWithMultiUsage for Optionals
commit_hash:44ab80a72c410e6d0afbb4a8cb818ce01426115e
| -rw-r--r-- | yql/essentials/core/common_opt/yql_co_extr_members.cpp | 23 | ||||
| -rw-r--r-- | yql/essentials/core/common_opt/yql_co_extr_members.h | 7 | ||||
| -rw-r--r-- | yql/essentials/core/common_opt/yql_co_finalizers.cpp | 70 | ||||
| -rw-r--r-- | yql/essentials/core/common_opt/yql_co_flow2.cpp | 2 | ||||
| -rw-r--r-- | yql/essentials/core/common_opt/yql_co_simple1.cpp | 8 | ||||
| -rw-r--r-- | yql/essentials/core/yql_opt_utils.cpp | 23 | ||||
| -rw-r--r-- | yql/essentials/core/yql_opt_utils.h | 3 | ||||
| -rw-r--r-- | yql/essentials/tests/sql/minirun/part8/canondata/result.json | 12 |
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]": [ |
