diff options
author | aakulaga <aakulaga@ydb.tech> | 2022-10-10 11:47:26 +0300 |
---|---|---|
committer | aakulaga <aakulaga@ydb.tech> | 2022-10-10 11:47:26 +0300 |
commit | 6acbe1a0f9e594f72b257208ec5e9e0c17b74059 (patch) | |
tree | 7f06b8cf1561267ae5bef3f6b1abf6d7c2599b11 | |
parent | 8017b5d2b0b9a4981545de7a18869c8b4f889524 (diff) | |
download | ydb-6acbe1a0f9e594f72b257208ec5e9e0c17b74059.tar.gz |
Fix optional types in join columns
Fix optional types in join columns
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); |