aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@ydb.tech>2022-09-26 19:32:23 +0300
committervvvv <vvvv@ydb.tech>2022-09-26 19:32:23 +0300
commitd4faa398be8fa410481d8bbff90b0984ca537fe5 (patch)
tree891187ba0c966fabcace0f8b4c1f3a2fcfe01435
parent91cdfb6d765fc121f80bf6b84b6fad2a9e11e4e7 (diff)
downloadydb-d4faa398be8fa410481d8bbff90b0984ca537fe5.tar.gz
fixed LambdaArgumentsCount for optional args
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/types.md14
-rw-r--r--ydb/library/yql/core/type_ann/type_ann_core.cpp38
-rw-r--r--ydb/library/yql/sql/v1/builtin.cpp1
3 files changed, 50 insertions, 3 deletions
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/types.md b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/types.md
index 360ca4f5a2..6af97c139c 100644
--- a/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/types.md
+++ b/ydb/docs/ru/core/yql/reference/yql-core/builtins/_includes/types.md
@@ -795,4 +795,18 @@ SELECT LambdaArgumentsCount(($x, $y)->($x+$y))
; -- 2
```
+## LambdaOptionalArgumentsCount
+
+**Сигнатура**
+```
+LambdaOptionalArgumentsCount(LambdaFunction)->Uint32
+```
+Получение количества опциональных аргументов в лямбда-функции.
+
+**Примеры:**
+``` yql
+SELECT LambdaOptionalArgumentsCount(($x, $y, $z?)->(if($x,$y,$z)))
+; -- 1
+```
+
{% endif %}
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 057c290b60..678a587cec 100644
--- a/ydb/library/yql/core/type_ann/type_ann_core.cpp
+++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp
@@ -9751,14 +9751,45 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
return IGraphTransformer::TStatus::Error;
}
- if (!input->Head().IsLambda()) {
- ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Expected lambda, but got: " << input->Head().Type()));
+ auto lambda = input->HeadPtr();
+ if (input->Head().IsCallable("WithOptionalArgs")) {
+ lambda = input->Head().HeadPtr();
+ }
+
+ if (!lambda->IsLambda()) {
+ ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Expected lambda, but got: " << lambda->Type()));
+ return IGraphTransformer::TStatus::Error;
+ }
+
+ output = ctx.Expr.Builder(input->Pos())
+ .Callable("Uint32")
+ .Atom(0, ToString(lambda->Head().ChildrenSize()))
+ .Seal()
+ .Build();
+
+ return IGraphTransformer::TStatus::Repeat;
+ }
+
+ IGraphTransformer::TStatus LambdaOptionalArgumentsCountWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
+ if (!EnsureArgsCount(*input, 1, ctx.Expr)) {
+ return IGraphTransformer::TStatus::Error;
+ }
+
+ ui32 optionalArgsCount = 0;
+ auto lambda = input->HeadPtr();
+ if (input->Head().IsCallable("WithOptionalArgs")) {
+ lambda = input->Head().HeadPtr();
+ optionalArgsCount = FromString<ui32>(input->Head().Tail().Content());
+ }
+
+ if (!lambda->IsLambda()) {
+ ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Expected lambda, but got: " << lambda->Type()));
return IGraphTransformer::TStatus::Error;
}
output = ctx.Expr.Builder(input->Pos())
.Callable("Uint32")
- .Atom(0, ToString(input->Head().Head().ChildrenSize()))
+ .Atom(0, ToString(optionalArgsCount))
.Seal()
.Build();
@@ -11515,6 +11546,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
Functions["CallableArgument"] = &CallableArgumentWrapper;
Functions["CallableTypeHandle"] = &MakeTypeHandleWrapper<ETypeAnnotationKind::Callable>;
Functions["LambdaArgumentsCount"] = LambdaArgumentsCountWrapper;
+ Functions["LambdaOptionalArgumentsCount"] = LambdaOptionalArgumentsCountWrapper;
Functions["FormatCode"] = &FormatCodeWrapper;
Functions["FormatCodeWithPositions"] = &FormatCodeWrapper;
Functions["SerializeCode"] = &FormatCodeWrapper;
diff --git a/ydb/library/yql/sql/v1/builtin.cpp b/ydb/library/yql/sql/v1/builtin.cpp
index 9fa9334047..5ee117730c 100644
--- a/ydb/library/yql/sql/v1/builtin.cpp
+++ b/ydb/library/yql/sql/v1/builtin.cpp
@@ -2864,6 +2864,7 @@ struct TBuiltinFuncData {
{"reprcode", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("ReprCode", 1, 1) },
{"quotecode", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("QuoteCode", 1, 1) },
{"lambdaargumentscount", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("LambdaArgumentsCount", 1, 1) },
+ {"lambdaoptionalargumentscount", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("LambdaOptionalArgumentsCount", 1, 1) },
{"subqueryextend", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("SubqueryExtend", 1, -1) },
{"subqueryunionall", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("SubqueryUnionAll", 1, -1) },
{"subquerymerge", BuildNamedArgcBuiltinFactoryCallback<TCallNodeImpl>("SubqueryMerge", 1, -1) },