diff options
author | Vitaly Stoyan <vitstn@gmail.com> | 2022-07-03 14:42:50 +0300 |
---|---|---|
committer | Vitaly Stoyan <vitstn@gmail.com> | 2022-07-03 14:42:50 +0300 |
commit | e9e74c9bd8831f3c354a56d443a00d45ca0eb59c (patch) | |
tree | 2ecba23507928f5e66b434690bc5b6ad44c96c3d | |
parent | 47d9d2778d353369eef7d7b61f3573c15fde3778 (diff) | |
download | ydb-e9e74c9bd8831f3c354a56d443a00d45ca0eb59c.tar.gz |
YQL-14728 use sqlIn if possible
ref:73063d348d4e6c6f6db14961bac7f8c5f0c87ac2
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_pgselect.cpp | 59 |
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() |