summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <[email protected]>2023-08-31 11:58:42 +0300
committeraneporada <[email protected]>2023-08-31 13:01:28 +0300
commit6b4513c353977db2ca72049e794a28e700ae189f (patch)
tree8eda0acf0f0e42551ecbbbf9556ac42e11c10343
parentc97e8410c933a5c821a7615370b6558417fd569c (diff)
Make sure we don't emit AsScalar for unsupported block types
-rw-r--r--ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp6
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_blocks.cpp14
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_blocks.h2
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_core.cpp2
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp24
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.h2
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);