aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2023-10-06 13:45:42 +0300
committeraneporada <aneporada@ydb.tech>2023-10-06 14:23:01 +0300
commit6cb9053e1765a07a896744604a1e7c042cd7d93d (patch)
tree05bd7074e58add8164ee966770599ee32fdff52b
parentfbe253f3a4d6865f077f9e7b5a3d9a335ef1bf0f (diff)
downloadydb-6cb9053e1765a07a896744604a1e7c042cd7d93d.tar.gz
Fix CommonType for Resource and Data
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp22
-rw-r--r--ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.cfg3
-rw-r--r--ydb/library/yql/tests/sql/suites/expr/common_type_for_resource_and_data.sql6
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);
+