diff options
author | vvvv <vvvv@yandex-team.ru> | 2022-04-06 18:02:08 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.ru> | 2022-04-06 18:02:08 +0300 |
commit | 48fb997d7f820a474b9094a72d9798a95ec612b7 (patch) | |
tree | fcfc009a4590ef14e33b4d462fe654aaf47ae640 | |
parent | 7505ed806e658318620c0545894f2db550f5edf4 (diff) | |
download | ydb-48fb997d7f820a474b9094a72d9798a95ec612b7.tar.gz |
YQL-13710 pgtypes in offset/limit
ref:479b591b8aafe54aa4e187cd8f7ebde9d3127d8a
-rw-r--r-- | ydb/library/yql/core/common_opt/yql_co_simple1.cpp | 8 | ||||
-rw-r--r-- | ydb/library/yql/core/type_ann/type_ann_core.cpp | 32 |
2 files changed, 28 insertions, 12 deletions
diff --git a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp index 9330a6447d5..7408d750ce4 100644 --- a/ydb/library/yql/core/common_opt/yql_co_simple1.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_simple1.cpp @@ -7190,7 +7190,9 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { .Callable(1, "Unwrap") .Callable(0, "SafeCast") .Callable(0, "Coalesce") - .Add(0, offset->ChildPtr(1)) + .Callable(0,"FromPg") + .Add(0, offset->ChildPtr(1)) + .Seal() .Callable(1, "Int64") .Atom(0, "0") .Seal() @@ -7212,7 +7214,9 @@ void RegisterCoSimpleCallables1(TCallableOptimizerMap& map) { .Callable(1, "Unwrap") .Callable(0, "SafeCast") .Callable(0, "Coalesce") - .Add(0, limit->ChildPtr(1)) + .Callable(0,"FromPg") + .Add(0, limit->ChildPtr(1)) + .Seal() .Callable(1, "Int64") .Atom(0, "9223372036854775807") // 2**63-1 .Seal() 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 dda74daf311..7c6473734be 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -11214,18 +11214,30 @@ template <NKikimr::NUdf::EDataSlot DataSlot> return IGraphTransformer::TStatus::Error; } - const TTypeAnnotationNode* expectedType = ctx.Expr.MakeType<TOptionalExprType>( + auto& data = option->ChildRef(1); + if (data->GetTypeAnn() && data->GetTypeAnn()->GetKind() == ETypeAnnotationKind::Null) { + // nothing to do + } else if (data->GetTypeAnn() && data->GetTypeAnn()->GetKind() == ETypeAnnotationKind::Pg) { + auto name = data->GetTypeAnn()->Cast<TPgExprType>()->GetName(); + if (name != "int4" && name != "int8") { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(data->Pos()), TStringBuilder() << + "Expected int4/int8 type, but got: " << name)); + return IGraphTransformer::TStatus::Error; + } + } else { + const TTypeAnnotationNode* expectedType = ctx.Expr.MakeType<TOptionalExprType>( ctx.Expr.MakeType<TDataExprType>(EDataSlot::Int64)); - auto convertStatus = TryConvertTo(option->ChildRef(1), *expectedType, ctx.Expr); - if (convertStatus.Level == IGraphTransformer::TStatus::Error) { - ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(option->Child(1)->Pos()), "Mismatch argument types")); - return IGraphTransformer::TStatus::Error; - } + auto convertStatus = TryConvertTo(data, *expectedType, ctx.Expr); + if (convertStatus.Level == IGraphTransformer::TStatus::Error) { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(data->Pos()), "Mismatch argument types")); + return IGraphTransformer::TStatus::Error; + } - if (convertStatus.Level != IGraphTransformer::TStatus::Ok) { - auto newSettings = ReplaceSetting(options, {}, TString(optionName), option->ChildPtr(1), ctx.Expr); - output = ctx.Expr.ChangeChild(*input, 0, std::move(newSettings)); - return IGraphTransformer::TStatus::Repeat; + if (convertStatus.Level != IGraphTransformer::TStatus::Ok) { + auto newSettings = ReplaceSetting(options, {}, TString(optionName), option->ChildPtr(1), ctx.Expr); + output = ctx.Expr.ChangeChild(*input, 0, std::move(newSettings)); + return IGraphTransformer::TStatus::Repeat; + } } } else if (optionName == "sort") { if (pass != 1) { |