aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Stoyan <vitstn@gmail.com>2022-07-03 14:42:50 +0300
committerVitaly Stoyan <vitstn@gmail.com>2022-07-03 14:42:50 +0300
commite9e74c9bd8831f3c354a56d443a00d45ca0eb59c (patch)
tree2ecba23507928f5e66b434690bc5b6ad44c96c3d
parent47d9d2778d353369eef7d7b61f3573c15fde3778 (diff)
downloadydb-e9e74c9bd8831f3c354a56d443a00d45ca0eb59c.tar.gz
YQL-14728 use sqlIn if possible
ref:73063d348d4e6c6f6db14961bac7f8c5f0c87ac2
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_pgselect.cpp59
1 files changed, 42 insertions, 17 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp
index 98be0f2383..1415f036b7 100644
--- a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp
+++ b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp
@@ -273,6 +273,41 @@ std::pair<TExprNode::TPtr, TExprNode::TPtr> RewriteSubLinks(TPositionHandle pos,
.Seal()
.Build();
} else if (linkType == "any" || linkType == "all") {
+ const bool useIn = testLambda->Tail().IsCallable("PgResolvedOp")
+ && testLambda->Tail().Head().Content() == "="
+ && testLambda->Tail().Child(3) == testLambda->Head().Child(1)
+ && !IsDepended(*testLambda->Tail().Child(2), *testLambda->Head().Child(1));
+
+ if (useIn) {
+ auto value = ctx.ReplaceNodes(testLambda->Tail().ChildPtr(2), {
+ {testLambda->Head().Child(0), originalRow}
+ });
+
+ return ctx.Builder(node->Pos())
+ .Callable("ToPg")
+ .Callable(0, "SqlIn")
+ .Callable(0, "Map")
+ .Callable(0, "Collect")
+ .Add(0, select)
+ .Seal()
+ .Lambda(1)
+ .Param("row")
+ .Callable("SingleMember")
+ .Arg(0, "row")
+ .Seal()
+ .Seal()
+ .Seal()
+ .Add(1, value)
+ .List(2)
+ .List(0)
+ .Atom(0, "ansi")
+ .Seal()
+ .Seal()
+ .Seal()
+ .Seal()
+ .Build();
+ }
+
auto foldArg = ctx.NewArgument(node->Pos(), "linkRow");
auto stateArg = ctx.NewArgument(node->Pos(), "state");
auto foldArgs = ctx.NewArguments(node->Pos(), { foldArg, stateArg });
@@ -2389,23 +2424,13 @@ TExprNode::TPtr ExpandPgLike(const TExprNode::TPtr& node, TExprContext& ctx, TOp
TExprNode::TPtr ExpandPgIn(const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) {
Y_UNUSED(optCtx);
return ctx.Builder(node->Pos())
- .Callable("Fold")
- .Add(0, node->ChildPtr(1))
- .Callable(1, "PgConst")
- .Atom(0, "false")
- .Callable(1, "PgType")
- .Atom(0, "bool")
- .Seal()
- .Seal()
- .Lambda(2)
- .Param("item")
- .Param("state")
- .Callable("PgOr")
- .Arg(0, "state")
- .Callable(1, "PgOp")
- .Atom(0, "=")
- .Arg(1, "item")
- .Add(2, node->ChildPtr(0))
+ .Callable("ToPg")
+ .Callable(0, "SqlIn")
+ .Add(0, node->ChildPtr(1))
+ .Add(1, node->ChildPtr(0))
+ .List(2)
+ .List(0)
+ .Atom(0, "ansi")
.Seal()
.Seal()
.Seal()