diff options
| author | aneporada <[email protected]> | 2023-08-31 11:58:42 +0300 |
|---|---|---|
| committer | aneporada <[email protected]> | 2023-08-31 13:01:28 +0300 |
| commit | 6b4513c353977db2ca72049e794a28e700ae189f (patch) | |
| tree | 8eda0acf0f0e42551ecbbbf9556ac42e11c10343 | |
| parent | c97e8410c933a5c821a7615370b6558417fd569c (diff) | |
Make sure we don't emit AsScalar for unsupported block types
6 files changed, 39 insertions, 11 deletions
diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index fb7b921312d..5aef6b8f1ba 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -5001,6 +5001,10 @@ bool CollectBlockRewrites(const TMultiExprType* multiInputType, bool keepInputCo std::string_view arrowFunctionName; if (node->IsList() || node->IsCallable({"And", "Or", "Xor", "Not", "Coalesce", "If", "Just", "Nth", "ToPg", "FromPg", "PgResolvedCall", "PgResolvedOp"})) { + if (node->IsCallable() && !IsSupportedAsBlockType(node->Pos(), *node->GetTypeAnn(), ctx, types)) { + return true; + } + ui32 startIndex = 0; if (node->IsCallable("PgResolvedCall")) { if (node->GetTypeAnn()->GetKind() != ETypeAnnotationKind::Pg) { @@ -5025,7 +5029,7 @@ bool CollectBlockRewrites(const TMultiExprType* multiInputType, bool keepInputCo auto child = node->ChildPtr(index); if (!child->GetTypeAnn()->IsComputable()) { funcArgs.push_back(child); - } else if (child->IsComplete()) { + } else if (child->IsComplete() && IsSupportedAsBlockType(child->Pos(), *child->GetTypeAnn(), ctx, types)) { funcArgs.push_back(ctx.NewCallable(node->Pos(), "AsScalar", { child })); } else if (auto rit = rewrites.find(child.Get()); rit != rewrites.end()) { funcArgs.push_back(rit->second); diff --git a/ydb/library/yql/core/type_ann/type_ann_blocks.cpp b/ydb/library/yql/core/type_ann/type_ann_blocks.cpp index 7d5d04bcd5b..380f548bc77 100644 --- a/ydb/library/yql/core/type_ann/type_ann_blocks.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_blocks.cpp @@ -13,7 +13,7 @@ namespace NYql { namespace NTypeAnnImpl { -IGraphTransformer::TStatus AsScalarWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) { +IGraphTransformer::TStatus AsScalarWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx) { Y_UNUSED(output); if (!EnsureArgsCount(*input, 1U, ctx.Expr)) { return IGraphTransformer::TStatus::Error; @@ -29,6 +29,10 @@ IGraphTransformer::TStatus AsScalarWrapper(const TExprNode::TPtr& input, TExprNo return IGraphTransformer::TStatus::Error; } + if (!EnsureSupportedAsBlockType(input->Pos(), *type, ctx.Expr, ctx.Types)) { + return IGraphTransformer::TStatus::Error; + } + input->SetTypeAnn(ctx.Expr.MakeType<TScalarExprType>(type)); return IGraphTransformer::TStatus::Ok; } @@ -723,11 +727,6 @@ IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TEx return IGraphTransformer::TStatus::Error; } - if (!ctx.Types.ArrowResolver) { - ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), "Arrow resolver isn't available")); - return IGraphTransformer::TStatus::Error; - } - const auto multiType = input->Head().GetTypeAnn()->Cast<TFlowExprType>()->GetItemType()->Cast<TMultiExprType>(); TTypeAnnotationNode::TListType retMultiType; for (const auto& type : multiType->GetItems()) { @@ -740,8 +739,7 @@ IGraphTransformer::TStatus WideToBlocksWrapper(const TExprNode::TPtr& input, TEx return IGraphTransformer::TStatus::Error; } - if (ctx.Types.ArrowResolver->AreTypesSupported(ctx.Expr.GetPosition(input->Pos()), { type }, ctx.Expr) != IArrowResolver::OK) { - ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Type " << *type << " is not supported in Block mode")); + if (!EnsureSupportedAsBlockType(input->Pos(), *type, ctx.Expr, ctx.Types)) { return IGraphTransformer::TStatus::Error; } diff --git a/ydb/library/yql/core/type_ann/type_ann_blocks.h b/ydb/library/yql/core/type_ann/type_ann_blocks.h index cc2251aff5d..3bcfcb14fce 100644 --- a/ydb/library/yql/core/type_ann/type_ann_blocks.h +++ b/ydb/library/yql/core/type_ann/type_ann_blocks.h @@ -8,7 +8,7 @@ namespace NYql { namespace NTypeAnnImpl { - IGraphTransformer::TStatus AsScalarWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); + IGraphTransformer::TStatus AsScalarWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TExtContext& ctx); IGraphTransformer::TStatus BlockCompressWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus BlockExpandChunkedWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus BlockCoalesceWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); 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 293a86702a7..707b1a05fd7 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -12062,7 +12062,6 @@ template <NKikimr::NUdf::EDataSlot DataSlot> Functions["WideSortBlocks"] = &WideSortBlocksWrapper; Functions["BlockExtend"] = &BlockExtendWrapper; - Functions["AsScalar"] = &AsScalarWrapper; Functions["BlockCoalesce"] = &BlockCoalesceWrapper; Functions["BlockAnd"] = &BlockLogicalWrapper; Functions["BlockOr"] = &BlockLogicalWrapper; @@ -12079,6 +12078,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot> ExtFunctions["BlockFunc"] = &BlockFuncWrapper; ExtFunctions["BlockBitCast"] = &BlockBitCastWrapper; + ExtFunctions["AsScalar"] = &AsScalarWrapper; ExtFunctions["WideToBlocks"] = &WideToBlocksWrapper; ExtFunctions["BlockCombineAll"] = &BlockCombineAllWrapper; ExtFunctions["BlockCombineHashed"] = &BlockCombineHashedWrapper; diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp index 0d9c27c0979..31df02ed85a 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.cpp +++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp @@ -2818,6 +2818,30 @@ bool IsWideBlockType(const TTypeAnnotationNode& type) { return blockLenType->Cast<TDataExprType>()->GetSlot() == EDataSlot::Uint64; } +bool IsSupportedAsBlockType(TPositionHandle pos, const TTypeAnnotationNode& type, TExprContext& ctx, TTypeAnnotationContext& types) { + if (!types.ArrowResolver) { + return false; + } + + auto resolveStatus = types.ArrowResolver->AreTypesSupported(ctx.GetPosition(pos), { &type }, ctx); + YQL_ENSURE(resolveStatus != IArrowResolver::ERROR); + return resolveStatus == IArrowResolver::OK; +} + +bool EnsureSupportedAsBlockType(TPositionHandle pos, const TTypeAnnotationNode& type, TExprContext& ctx, TTypeAnnotationContext& types) { + if (!types.ArrowResolver) { + ctx.AddError(TIssue(ctx.GetPosition(pos), "Arrow resolver isn't available")); + return false; + } + + if (!IsSupportedAsBlockType(pos, type, ctx, types)) { + ctx.AddError(TIssue(ctx.GetPosition(pos), TStringBuilder() << "Type " << type << " is not supported in Block mode")); + return false; + } + + return true; +} + bool EnsureWideBlockType(TPositionHandle position, const TTypeAnnotationNode& type, TTypeAnnotationNode::TListType& blockItemTypes, TExprContext& ctx, bool allowScalar) { if (HasError(&type, ctx)) { return false; diff --git a/ydb/library/yql/core/yql_expr_type_annotation.h b/ydb/library/yql/core/yql_expr_type_annotation.h index df2666bc95f..eeaab5bb5db 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.h +++ b/ydb/library/yql/core/yql_expr_type_annotation.h @@ -125,6 +125,8 @@ bool EnsureWideFlowType(TPositionHandle position, const TTypeAnnotationNode& typ bool EnsureWideStreamType(const TExprNode& node, TExprContext& ctx); bool EnsureWideStreamType(TPositionHandle position, const TTypeAnnotationNode& type, TExprContext& ctx); bool IsWideBlockType(const TTypeAnnotationNode& type); +bool IsSupportedAsBlockType(TPositionHandle pos, const TTypeAnnotationNode& type, TExprContext& ctx, TTypeAnnotationContext& types); +bool EnsureSupportedAsBlockType(TPositionHandle pos, const TTypeAnnotationNode& type, TExprContext& ctx, TTypeAnnotationContext& types); bool EnsureWideBlockType(TPositionHandle position, const TTypeAnnotationNode& type, TTypeAnnotationNode::TListType& blockItemTypes, TExprContext& ctx, bool allowScalar = true); bool EnsureWideFlowBlockType(const TExprNode& node, TTypeAnnotationNode::TListType& blockItemTypes, TExprContext& ctx, bool allowScalar = true); bool EnsureWideStreamBlockType(const TExprNode& node, TTypeAnnotationNode::TListType& blockItemTypes, TExprContext& ctx, bool allowScalar = true); |
