diff options
author | aneporada <aneporada@ydb.tech> | 2023-01-05 22:47:23 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-01-05 22:47:23 +0300 |
commit | 935916bda3969ae8aaea170129ec0db8a8392270 (patch) | |
tree | fdcd8b63bc876d642eb569b51af7aba60504d300 | |
parent | 97c1b4fc326f4a9435bc743e56681bb148b17c37 (diff) | |
download | ydb-935916bda3969ae8aaea170129ec0db8a8392270.tar.gz |
Improve optimizer for StringContains/StartsWith/EndsWith + empty pattern
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 17 |
1 files changed, 14 insertions, 3 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 b4afdb81c1..bbd19a2ddd 100644 --- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp @@ -4520,10 +4520,21 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { map["IsDistinctFrom"] = std::bind(&OptimizeDistinctFrom<false>, _1, _2); map["StartsWith"] = map["EndsWith"] = map["StringContains"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& /*optCtx*/) { - if (node->GetTypeAnn()->GetKind() != ETypeAnnotationKind::Optional && - node->Tail().IsCallable("String") && node->Tail().Head().Content().empty()) - { + if (node->Tail().IsCallable("String") && node->Tail().Head().Content().empty()) { YQL_CLOG(DEBUG, Core) << node->Content() << " with empty string in second argument"; + if (node->GetTypeAnn()->GetKind() == ETypeAnnotationKind::Optional) { + return ctx.Builder(node->Pos()) + .Callable("Map") + .Add(0, node->HeadPtr()) + .Lambda(1) + .Param("unwrappedFirstArg") + .Callable("Bool") + .Atom(0, "true", TNodeFlags::Default) + .Seal() + .Seal() + .Seal() + .Build(); + } return MakeBool<true>(node->Pos(), ctx); } |