aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-01-25 12:53:44 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-01-25 12:53:44 +0300
commit3a25c623a3b31ea10258fe997095be654d4c2638 (patch)
treee5653339da5d54ad8f25561ef0ea3c6638b02c43
parent72e9af3baa230f3e1b63832986ba6e2c92b9ac9b (diff)
downloadydb-3a25c623a3b31ea10258fe997095be654d4c2638.tar.gz
WideTop[Sort] add forgotten checks.
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_wide.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/ydb/library/yql/core/type_ann/type_ann_wide.cpp b/ydb/library/yql/core/type_ann/type_ann_wide.cpp
index 65fe225544..4c363c7487 100644
--- a/ydb/library/yql/core/type_ann/type_ann_wide.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_wide.cpp
@@ -713,8 +713,8 @@ IGraphTransformer::TStatus WideTopWrapper(const TExprNode::TPtr& input, TExprNod
return IGraphTransformer::TStatus::Error;
}
- const auto width = input->Head().GetTypeAnn()->Cast<TFlowExprType>()->GetItemType()->Cast<TMultiExprType>()->GetSize();
- if (!(EnsureTupleMinSize(input->Tail(), 1U, ctx.Expr) && EnsureTupleMaxSize(input->Tail(), width, ctx.Expr))) {
+ const auto& types = input->Head().GetTypeAnn()->Cast<TFlowExprType>()->GetItemType()->Cast<TMultiExprType>()->GetItems();
+ if (!(EnsureTupleMinSize(input->Tail(), 1U, ctx.Expr) && EnsureTupleMaxSize(input->Tail(), types.size(), ctx.Expr))) {
return IGraphTransformer::TStatus::Error;
}
@@ -729,7 +729,7 @@ IGraphTransformer::TStatus WideTopWrapper(const TExprNode::TPtr& input, TExprNod
}
if (ui32 index; TryFromString(item->Head().Content(), index)) {
- if (index >= width) {
+ if (index >= types.size()) {
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(item->Head().Pos()),
TStringBuilder() << "Index too large: " << index));
return IGraphTransformer::TStatus::Error;
@@ -738,6 +738,15 @@ IGraphTransformer::TStatus WideTopWrapper(const TExprNode::TPtr& input, TExprNod
TStringBuilder() << "Duplicate index: " << index));
return IGraphTransformer::TStatus::Error;
}
+
+ const TDataExprType* type = nullptr;
+ if (bool opt; !EnsureDataOrOptionalOfData( item->Head().Pos(), types[index], opt, type, ctx.Expr)) {
+ return IGraphTransformer::TStatus::Error;
+ }
+
+ if (!EnsureComparableType(input->Pos(), *type, ctx.Expr)) {
+ return IGraphTransformer::TStatus::Error;
+ }
} else {
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(item->Head().Pos()),
TStringBuilder() << "Invalid index value: " << item->Head().Content()));