aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraakulaga <aakulaga@ydb.tech>2022-10-10 11:47:26 +0300
committeraakulaga <aakulaga@ydb.tech>2022-10-10 11:47:26 +0300
commit6acbe1a0f9e594f72b257208ec5e9e0c17b74059 (patch)
tree7f06b8cf1561267ae5bef3f6b1abf6d7c2599b11
parent8017b5d2b0b9a4981545de7a18869c8b4f889524 (diff)
downloadydb-6acbe1a0f9e594f72b257208ec5e9e0c17b74059.tar.gz
Fix optional types in join columns
Fix optional types in join columns
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_join.cpp7
-rw-r--r--ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp2
-rw-r--r--ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp17
3 files changed, 19 insertions, 7 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_join.cpp b/ydb/library/yql/core/type_ann/type_ann_join.cpp
index 4d71278884b..dc6eaa097e4 100644
--- a/ydb/library/yql/core/type_ann/type_ann_join.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_join.cpp
@@ -591,7 +591,10 @@ namespace NTypeAnnImpl {
return IGraphTransformer::TStatus::Error;
}
- const auto columnType = GetFieldType(leftTupleType, *oldPos);
+ auto columnType = GetFieldType(leftTupleType, *oldPos);
+ if ((joinKind == "Right" || joinKind == "Full" || joinKind == "Exclusion") && !columnType->IsOptionalOrNull()) {
+ columnType = ctx.Expr.MakeType<TOptionalExprType>(columnType);
+ }
if (ui32 index; !TryFromString(newName->Content(), index) || index >= resultItems.size()) {
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(newName->Pos()), TStringBuilder() << "Invalid output field index: " << newName->Content()));
@@ -623,7 +626,7 @@ namespace NTypeAnnImpl {
}
auto columnType = GetFieldType(rightTupleType, *oldPos);
- if (joinKind == "Left" && !columnType->IsOptionalOrNull()) {
+ if ((joinKind == "Left" || joinKind == "Full" || joinKind == "Exclusion" ) && !columnType->IsOptionalOrNull()) {
columnType = ctx.Expr.MakeType<TOptionalExprType>(columnType);
}
diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp b/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp
index 8909a2c7016..0f9cad8ab7f 100644
--- a/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp
+++ b/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp
@@ -420,6 +420,8 @@ inline bool HasRightIdMatch(ui64 currId, ui64 & rightIdIter, const std::vector<u
while ( rightIdIter < rightIds.size() && currId > rightIds[rightIdIter]) rightIdIter++;
+ if (rightIdIter >= rightIds.size()) return false;
+
if (currId == rightIds[rightIdIter]) {
return true;
} else {
diff --git a/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp b/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp
index 757dbfafb4f..9515e3e5d3b 100644
--- a/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp
+++ b/ydb/library/yql/providers/common/mkql/yql_provider_mkql.cpp
@@ -1458,15 +1458,22 @@ TMkqlCommonCallableCompiler::TShared::TShared() {
}
const auto leftTupleType = leftItemType->Cast<TMultiExprType>();
- const auto rightTupleType = leftItemType->Cast<TMultiExprType>();
+ const auto rightTupleType = rightItemType->Cast<TMultiExprType>();
const auto outputTupleType = outputItemType->Cast<TMultiExprType>();
- node.Child(3)->ForEachChild([&](const TExprNode& child){ leftKeyColumns.emplace_back(*GetFieldPosition(*leftTupleType, child.Content())); });
- node.Child(4)->ForEachChild([&](const TExprNode& child){ rightKeyColumns.emplace_back(*GetFieldPosition(*rightTupleType, child.Content())); });
+ node.Child(3)->ForEachChild([&](TExprNode& child){
+ leftKeyColumns.emplace_back(*GetFieldPosition(*leftTupleType, child.Content()));
+ });
+ node.Child(4)->ForEachChild([&](TExprNode& child){
+ rightKeyColumns.emplace_back(*GetFieldPosition(*rightTupleType, child.Content())); });
bool s = false;
- node.Child(5)->ForEachChild([&](const TExprNode& child){ leftRenames.emplace_back(*GetFieldPosition((s = !s) ? *leftTupleType : *outputTupleType, child.Content())); });
+ node.Child(5)->ForEachChild([&](TExprNode& child){
+ leftRenames.emplace_back(*GetFieldPosition((s = !s) ? *leftTupleType : *outputTupleType, child.Content())); });
s = false;
- node.Child(6)->ForEachChild([&](const TExprNode& child){ rightRenames.emplace_back(*GetFieldPosition((s = !s) ? *rightTupleType : *outputTupleType, child.Content())); });
+ node.Child(6)->ForEachChild([&](TExprNode& child){
+ rightRenames.emplace_back(*GetFieldPosition((s = !s) ? *rightTupleType : *outputTupleType, child.Content()));
+
+ });
const auto returnType = BuildType(node, *node.GetTypeAnn(), ctx.ProgramBuilder);
return ctx.ProgramBuilder.GraceJoin(flowLeft, flowRight, joinKind, leftKeyColumns, rightKeyColumns, leftRenames, rightRenames, returnType);