diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-03-27 10:49:47 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-03-27 10:49:47 +0300 |
commit | 5db72d26a3e08acf79aa8a3bdac86d05670abf64 (patch) | |
tree | 40065abfd3a06cd860a85a8ffaba2ba628fd09d1 | |
parent | 0701f0ff1650f8603ab263c2c1ea1ca26be89ef7 (diff) | |
download | ydb-5db72d26a3e08acf79aa8a3bdac86d05670abf64.tar.gz |
YQL-15415 Injection Unordered return back on common optimizers stage.
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 11 | ||||
-rw-r--r-- | ydb/library/yql/core/yql_expr_constraint.cpp | 11 |
2 files changed, 10 insertions, 12 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp index 69078853a33..8bed830f938 100644 --- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp @@ -1165,7 +1165,7 @@ TExprNode::TPtr OptimizeFlatContainerIf(const TExprNode::TPtr& node, TExprContex return node; } -template <bool HeadOrTail> +template <bool HeadOrTail, bool OrderAware = true> TExprNode::TPtr OptimizeToOptional(const TExprNode::TPtr& node, TExprContext& ctx) { if (node->Head().IsCallable("ToList")) { YQL_CLOG(DEBUG, Core) << node->Content() << " over " << node->Head().Content(); @@ -1183,6 +1183,13 @@ TExprNode::TPtr OptimizeToOptional(const TExprNode::TPtr& node, TExprContext& ct return ctx.NewCallable(node->Head().Pos(), "Nothing", {ExpandType(node->Pos(), *node->GetTypeAnn(), ctx)}); } + if constexpr (!OrderAware) { + if (node->Head().GetConstraint<TSortedConstraintNode>()) { + YQL_CLOG(DEBUG, Core) << node->Content() << " over sorted collection"; + return ctx.ChangeChild(*node, 0, ctx.NewCallable(node->Head().Pos(), "Unordered", {node->HeadPtr()})); + } + } + return node; } @@ -4544,7 +4551,7 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { return node; }; - map["ToOptional"] = std::bind(OptimizeToOptional<true>, _1, _2); + map["ToOptional"] = std::bind(OptimizeToOptional<true, false>, _1, _2); map["Head"] = std::bind(OptimizeToOptional<true>, _1, _2); map["Last"] = std::bind(OptimizeToOptional<false>, _1, _2); diff --git a/ydb/library/yql/core/yql_expr_constraint.cpp b/ydb/library/yql/core/yql_expr_constraint.cpp index 52ceb2e6471..88ef226f24e 100644 --- a/ydb/library/yql/core/yql_expr_constraint.cpp +++ b/ydb/library/yql/core/yql_expr_constraint.cpp @@ -152,7 +152,7 @@ public: Functions["Just"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; Functions["Unwrap"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; Functions["ToList"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TUniqueConstraintNode, TPartOfUniqueConstraintNode, TDistinctConstraintNode, TPartOfDistinctConstraintNode, TPartOfSortedConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; - Functions["ToOptional"] = &TCallableConstraintTransformer::ToOptionalWrap; + Functions["ToOptional"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; Functions["Head"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; Functions["Last"] = &TCallableConstraintTransformer::FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>; Functions["Reverse"] = &TCallableConstraintTransformer::ReverseWrap; @@ -1713,15 +1713,6 @@ private: return TStatus::Ok; } - TStatus ToOptionalWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const { - if (input->Head().GetConstraint<TSortedConstraintNode>()) { - output = ctx.ChangeChild(*input, 0U, ctx.NewCallable(input->Pos(), "Unordered", {input->HeadPtr()})); - return TStatus::Repeat; - } - - return FromFirst<TPassthroughConstraintNode, TEmptyConstraintNode, TVarIndexConstraintNode, TMultiConstraintNode>(input, output, ctx); - } - template<bool IsList, bool IsFlat> TStatus PassOrEmptyWrap(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExprContext& ctx) const { if (const auto part = input->Tail().GetConstraint<TPartOfSortedConstraintNode>()) |