aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2022-12-15 12:07:25 +0300
committeraneporada <aneporada@ydb.tech>2022-12-15 12:07:25 +0300
commit34ed13a68befbfbd4e21088c20d6019311d7202d (patch)
treee7b7fe280130af5b0cbed333dda4a2a55b453955
parent5a94c3988f52cb5576b9a46c4a44d30f4c434d29 (diff)
downloadydb-34ed13a68befbfbd4e21088c20d6019311d7202d.tar.gz
Avoid rewriting Coalesce on type annotation stage before its arguments are converted to common type. Fix EquiJoin flatten option processing
String should be returned here instead of Utf8: https://yql.yandex-team.ru/Operations/Y5o09slwvamzkR7aBqw7F6GOxIe1VAFgQQWxKRw4lEQ=
-rw-r--r--ydb/library/yql/core/common_opt/yql_co_simple1.cpp49
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_core.cpp7
-rw-r--r--ydb/library/yql/core/yql_join.cpp2
3 files changed, 17 insertions, 41 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 b5de86a3a8e..e13fe4c280b 100644
--- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp
+++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp
@@ -248,60 +248,33 @@ TExprNode::TPtr ExpandFlattenEquiJoin(const TExprNode::TPtr& node, TExprContext&
auto joins = node->Child(node->ChildrenSize() - 2);
auto columnTypes = GetJoinColumnTypes(*joins, labels, ctx);
- TMap<TString, std::pair<bool, TVector<TString>>> remap; // column -> isOptional, list of columns
+ TMap<TString, TVector<TString>> remap; // result column -> list of original columns
for (auto it : labels.Inputs) {
for (auto item : it.InputType->GetItems()) {
TString fullName = it.FullName(item->GetName());
auto type = columnTypes.FindPtr(fullName);
if (type) {
- auto columnName = it.ColumnName(fullName);
- auto iter = remap.find(columnName);
- if (iter != remap.end()) {
- if (iter->second.first) {
- // still optional
- if ((*type)->GetKind() == ETypeAnnotationKind::Optional) {
- iter->second.second.push_back(fullName);
- } else {
- iter->second.first = false;
- iter->second.second.clear();
- iter->second.second.push_back(fullName);
- }
- }
- continue;
- }
-
- remap.emplace(TString(columnName), std::make_pair((*type)->GetKind() == ETypeAnnotationKind::Optional,
- TVector<TString>(1, fullName)));
+ TString columnName(it.ColumnName(fullName));
+ remap[columnName].push_back(fullName);
}
}
}
auto lambdaArg = ctx.NewArgument(node->Pos(), "row");
TExprNode::TListType remapItems;
- for (auto& x : remap) {
- TExprNode::TPtr value;
- if (x.second.second.size() == 1) {
- value = ctx.Builder(node->Pos())
+ for (auto& [resultName, sourceNames] : remap) {
+ TExprNode::TListType values;
+ for (auto& column : sourceNames) {
+ values.push_back(ctx.Builder(node->Pos())
.Callable("Member")
.Add(0, lambdaArg)
- .Atom(1, x.second.second.front())
+ .Atom(1, column)
.Seal()
- .Build();
- } else {
- TExprNode::TListType values;
- for (auto& column : x.second.second) {
- values.push_back(ctx.Builder(node->Pos())
- .Callable("Member")
- .Add(0, lambdaArg)
- .Atom(1, column)
- .Seal()
- .Build());
- }
-
- value = ctx.NewCallable(node->Pos(), "Coalesce", std::move(values));
+ .Build());
}
- remapItems.push_back(ctx.NewList(node->Pos(), { ctx.NewAtom(node->Pos(), x.first), value }));
+ TExprNode::TPtr coalesce = ctx.NewCallable(node->Pos(), "Coalesce", std::move(values));
+ remapItems.push_back(ctx.NewList(node->Pos(), { ctx.NewAtom(node->Pos(), resultName), coalesce }));
}
auto lambdaBody = ctx.NewCallable(node->Pos(), "AsStruct", std::move(remapItems));
diff --git a/ydb/library/yql/core/type_ann/type_ann_core.cpp b/ydb/library/yql/core/type_ann/type_ann_core.cpp
index ff05a762127..3a809f39715 100644
--- a/ydb/library/yql/core/type_ann/type_ann_core.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp
@@ -4449,15 +4449,18 @@ namespace NTypeAnnImpl {
}
const auto leftType = input->Head().GetTypeAnn();
+ const auto rightType = input->Tail().GetTypeAnn();
+
auto leftItemType = leftType;
if (leftType->GetKind() == ETypeAnnotationKind::Optional) {
leftItemType = leftType->Cast<TOptionalExprType>()->GetItemType();
- } else if (leftType->GetKind() != ETypeAnnotationKind::Pg) {
+ } else if (leftType->GetKind() != ETypeAnnotationKind::Pg &&
+ IsSameAnnotation(*RemoveOptionalType(leftType), *RemoveOptionalType(rightType)))
+ {
output = input->HeadPtr();
return IGraphTransformer::TStatus::Repeat;
}
- const auto rightType = input->Tail().GetTypeAnn();
auto rightItemType = rightType;
if (leftType->GetKind() != ETypeAnnotationKind::Optional &&
rightType->GetKind() == ETypeAnnotationKind::Optional) {
diff --git a/ydb/library/yql/core/yql_join.cpp b/ydb/library/yql/core/yql_join.cpp
index b10fbd20276..ec3b7b49405 100644
--- a/ydb/library/yql/core/yql_join.cpp
+++ b/ydb/library/yql/core/yql_join.cpp
@@ -819,7 +819,7 @@ IGraphTransformer::TStatus EquiJoinAnnotation(
}
}
- if (isOptional) {
+ if (isOptional && commonType->GetKind() != ETypeAnnotationKind::Optional) {
commonType = ctx.MakeType<TOptionalExprType>(commonType);
}