aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2023-01-05 22:47:23 +0300
committeraneporada <aneporada@ydb.tech>2023-01-05 22:47:23 +0300
commit935916bda3969ae8aaea170129ec0db8a8392270 (patch)
treefdcd8b63bc876d642eb569b51af7aba60504d300
parent97c1b4fc326f4a9435bc743e56681bb148b17c37 (diff)
downloadydb-935916bda3969ae8aaea170129ec0db8a8392270.tar.gz
Improve optimizer for StringContains/StartsWith/EndsWith + empty pattern
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_simple1.cpp17
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);
}