diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-01-25 12:53:44 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-01-25 12:53:44 +0300 |
commit | 3a25c623a3b31ea10258fe997095be654d4c2638 (patch) | |
tree | e5653339da5d54ad8f25561ef0ea3c6638b02c43 | |
parent | 72e9af3baa230f3e1b63832986ba6e2c92b9ac9b (diff) | |
download | ydb-3a25c623a3b31ea10258fe997095be654d4c2638.tar.gz |
WideTop[Sort] add forgotten checks.
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_wide.cpp | 15 |
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())); |