diff options
author | aneporada <aneporada@ydb.tech> | 2023-10-06 13:45:42 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-10-06 14:23:01 +0300 |
commit | 6cb9053e1765a07a896744604a1e7c042cd7d93d (patch) | |
tree | 05bd7074e58add8164ee966770599ee32fdff52b | |
parent | fbe253f3a4d6865f077f9e7b5a3d9a335ef1bf0f (diff) | |
download | ydb-6cb9053e1765a07a896744604a1e7c042cd7d93d.tar.gz |
Fix CommonType for Resource and Data
3 files changed, 26 insertions, 5 deletions
diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp index 30778c90066..ffc4098f865 100644 --- a/ydb/library/yql/core/yql_expr_type_annotation.cpp +++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp @@ -1327,14 +1327,26 @@ const TPgExprType* CommonType(TPositionHandle pos, const TPgExprType* one, const } template<bool Silent> -const TDataExprType* CommonType(TPositionHandle pos, const TResourceExprType* resource, const TDataExprType* data, TExprContext& ctx) { +const TResourceExprType* CommonType(TPositionHandle pos, const TResourceExprType* resource, const TDataExprType* data, TExprContext& ctx) { const auto slot = data->GetSlot(); const auto& tag = resource->GetTag(); - if (tag == "Yson2.Node" && EDataSlot::Yson == slot) - return data; + if ((tag == "Yson2.Node" || tag == "Yson.Node") && (EDataSlot::Yson == slot || EDataSlot::Json == slot)) { + return resource; + } - if constexpr (!Silent) - ctx.AddError(TIssue(ctx.GetPosition(pos), TStringBuilder() << "Incompatible resourse '" << tag << "' with " << GetDataTypeInfo(slot).Name)); + if (tag == "DateTime2.TM" && + (GetDataTypeInfo(slot).Features & (NUdf::EDataTypeFeatures::DateType | NUdf::EDataTypeFeatures::TzDateType))) + { + return resource; + } + + if (tag == "JsonNode" && EDataSlot::Json == slot) { + return resource; + } + + if constexpr (!Silent) { + ctx.AddError(TIssue(ctx.GetPosition(pos), TStringBuilder() << "Incompatible resource '" << tag << "' with " << GetDataTypeInfo(slot).Name)); + } return nullptr; } diff --git a/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.cfg b/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.cfg new file mode 100644 index 00000000000..d016b0b562e --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.cfg @@ -0,0 +1,3 @@ +udf yson2_udf +udf json2_udf +udf datetime2_udf diff --git a/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.sql b/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.sql new file mode 100644 index 00000000000..554c348b626 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.sql @@ -0,0 +1,6 @@ +select AsList(DateTime::StartOfMonth(CurrentUtcDate()), CurrentUtcDate()); + +select AsList(Yson::Parse("1"), "2"y); +select AsList(Yson::ParseJson("1"), "2"j); +select AsList(Json2::Parse("1"), "2"j); + |