summaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs
diff options
context:
space:
mode:
authorimunkin <[email protected]>2025-02-18 18:13:04 +0300
committerimunkin <[email protected]>2025-02-18 18:52:09 +0300
commitadd906303b66ed6c98751c33c4806d398662be2f (patch)
tree2c394721fb31d6783209452c69bd4e043e44de3e /yql/essentials/udfs
parent92ee8c57eca250bf8648398e0cd69031f9768275 (diff)
YQL-18303: Introduce Update overload
commit_hash:3afbcdd00ad47ecf35cb29bb25a5d7658ed1d5cb
Diffstat (limited to 'yql/essentials/udfs')
-rw-r--r--yql/essentials/udfs/common/datetime2/datetime_udf.cpp277
-rw-r--r--yql/essentials/udfs/common/datetime2/test/canondata/test.test_Update_/results.txt588
-rw-r--r--yql/essentials/udfs/common/datetime2/test/cases/Update.sql58
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/canondata/result.json10
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_UpdateTz_/results.txt64
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_Update_/results.txt1110
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.cfg1
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in8
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in.attr16
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.sql37
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/UpdateTz.sql9
11 files changed, 1879 insertions, 299 deletions
diff --git a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
index 5d0ca213e30..30c1a46ef25 100644
--- a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
+++ b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
@@ -512,8 +512,16 @@ TValue DoAddYears(const TValue& date, i64 years, const NUdf::IDateBuilder& build
#undef ACCESSORS
#undef ACCESSORS_POLY
- inline bool ValidateYear(ui16 year) {
- return year >= NUdf::MIN_YEAR - 1 || year <= NUdf::MAX_YEAR + 1;
+ // FIXME: The default value for TResourceName allows to omit
+ // explicit specialization in functions that still doesn't support
+ // big datetime types. Should be removed in future.
+ template<const char* TResourceName = TMResourceName>
+ inline bool ValidateYear(std::conditional_t<TResourceName == TMResourceName, ui16, i32> year) {
+ if constexpr (TResourceName == TMResourceName) {
+ return year >= NUdf::MIN_YEAR || year < NUdf::MAX_YEAR;
+ } else {
+ return year >= NUdf::MIN_YEAR32 || year < NUdf::MAX_YEAR32;
+ }
}
inline bool ValidateMonth(ui8 month) {
@@ -1412,88 +1420,8 @@ TUnboxedValue GetTimezoneName(const IValueBuilder* valueBuilder, const TUnboxedV
// Update
class TUpdate : public TBoxedValue {
- const TSourcePosition Pos_;
public:
- explicit TUpdate(TSourcePosition pos)
- : Pos_(pos)
- {}
-
- TUnboxedValue Run(
- const IValueBuilder* valueBuilder,
- const TUnboxedValuePod* args) const override
- {
- try {
- EMPTY_RESULT_ON_EMPTY_ARG(0);
- auto result = args[0];
-
- if (args[1]) {
- auto year = args[1].Get<ui16>();
- if (!ValidateYear(year)) {
- return TUnboxedValuePod();
- }
- SetYear(result, year);
- }
- if (args[2]) {
- auto month = args[2].Get<ui8>();
- if (!ValidateMonth(month)) {
- return TUnboxedValuePod();
- }
- SetMonth(result, month);
- }
- if (args[3]) {
- auto day = args[3].Get<ui8>();
- if (!ValidateDay(day)) {
- return TUnboxedValuePod();
- }
- SetDay(result, day);
- }
- if (args[4]) {
- auto hour = args[4].Get<ui8>();
- if (!ValidateHour(hour)) {
- return TUnboxedValuePod();
- }
- SetHour(result, hour);
- }
- if (args[5]) {
- auto minute = args[5].Get<ui8>();
- if (!ValidateMinute(minute)) {
- return TUnboxedValuePod();
- }
- SetMinute(result, minute);
- }
- if (args[6]) {
- auto second = args[6].Get<ui8>();
- if (!ValidateSecond(second)) {
- return TUnboxedValuePod();
- }
- SetSecond(result, second);
- }
- if (args[7]) {
- auto microsecond = args[7].Get<ui32>();
- if (!ValidateMicrosecond(microsecond)) {
- return TUnboxedValuePod();
- }
- SetMicrosecond(result, microsecond);
- }
- if (args[8]) {
- auto timezoneId = args[8].Get<ui16>();
- if (!ValidateTimezoneId(timezoneId)) {
- return TUnboxedValuePod();
- }
- SetTimezoneId(result, timezoneId);
- }
-
- auto& builder = valueBuilder->GetDateBuilder();
- auto& storage = Reference(result);
- if (!storage.Validate(builder)) {
- return TUnboxedValuePod();
- }
- return result;
- } catch (const std::exception& e) {
- UdfTerminate((TStringBuilder() << Pos_ << " " << e.what()).data());
- }
- }
-
+ typedef bool TTypeAwareMarker;
static const TStringRef& Name() {
static auto name = TStringRef::Of("Update");
return name;
@@ -1501,7 +1429,7 @@ TUnboxedValue GetTimezoneName(const IValueBuilder* valueBuilder, const TUnboxedV
static bool DeclareSignature(
const TStringRef& name,
- TType*,
+ TType* userType,
IFunctionTypeInfoBuilder& builder,
bool typesOnly)
{
@@ -1509,28 +1437,179 @@ TUnboxedValue GetTimezoneName(const IValueBuilder* valueBuilder, const TUnboxedV
return false;
}
- auto resourceType = builder.Resource(TMResourceName);
- auto optionalResourceType = builder.Optional()->Item(resourceType).Build();
+ if (!userType) {
+ builder.SetError("User type is missing");
+ return true;
+ }
- builder.OptionalArgs(8).Args()->Add(resourceType).Flags(ICallablePayload::TArgumentFlags::AutoMap)
- .Add(builder.Optional()->Item<ui16>().Build()).Name("Year")
- .Add(builder.Optional()->Item<ui8>().Build()).Name("Month")
- .Add(builder.Optional()->Item<ui8>().Build()).Name("Day")
- .Add(builder.Optional()->Item<ui8>().Build()).Name("Hour")
- .Add(builder.Optional()->Item<ui8>().Build()).Name("Minute")
- .Add(builder.Optional()->Item<ui8>().Build()).Name("Second")
- .Add(builder.Optional()->Item<ui32>().Build()).Name("Microsecond")
- .Add(builder.Optional()->Item<ui16>().Build()).Name("TimezoneId");
+ builder.UserType(userType);
- builder.Returns(optionalResourceType);
+ const auto typeInfoHelper = builder.TypeInfoHelper();
+ TTupleTypeInspector tuple(*typeInfoHelper, userType);
+ Y_ENSURE(tuple, "Tuple with args and options tuples expected");
+ Y_ENSURE(tuple.GetElementsCount() > 0,
+ "Tuple has to contain positional arguments");
- if (!typesOnly) {
- builder.Implementation(new TUpdate(builder.GetSourcePosition()));
+ TTupleTypeInspector argsTuple(*typeInfoHelper, tuple.GetElementType(0));
+ Y_ENSURE(argsTuple, "Tuple with args expected");
+ if (argsTuple.GetElementsCount() == 0) {
+ builder.SetError("At least one argument expected");
+ return true;
}
- builder.IsStrict();
+ auto argType = argsTuple.GetElementType(0);
+
+ if (const auto optType = TOptionalTypeInspector(*typeInfoHelper, argType)) {
+ argType = optType.GetItemType();
+ }
+
+ TResourceTypeInspector resource(*typeInfoHelper, argType);
+ if (!resource) {
+ TDataTypeInspector data(*typeInfoHelper, argType);
+ if (!data) {
+ SetInvalidTypeError(builder, typeInfoHelper, argType);
+ return true;
+ }
+
+ const auto features = NUdf::GetDataTypeInfo(NUdf::GetDataSlot(data.GetTypeId())).Features;
+ if (features & NUdf::BigDateType) {
+ BuildSignature<TM64ResourceName>(builder, typesOnly);
+ return true;
+ }
+ if (features & (NUdf::DateType | NUdf::TzDateType)) {
+ BuildSignature<TMResourceName>(builder, typesOnly);
+ return true;
+ }
+
+ SetInvalidTypeError(builder, typeInfoHelper, argType);
+ return true;
+ }
+
+ if (resource.GetTag() == TStringRef::Of(TM64ResourceName)) {
+ BuildSignature<TM64ResourceName>(builder, typesOnly);
+ return true;
+ }
+
+ if (resource.GetTag() == TStringRef::Of(TMResourceName)) {
+ BuildSignature<TMResourceName>(builder, typesOnly);
+ return true;
+ }
+
+ ::TStringBuilder sb;
+ sb << "Unexpected Resource tag: got '" << resource.GetTag() << "'";
+ builder.SetError(sb);
return true;
}
+ private:
+ template<const char* TResourceName>
+ class TImpl : public TBoxedValue {
+ public:
+ TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const final {
+ try {
+ EMPTY_RESULT_ON_EMPTY_ARG(0);
+ auto result = args[0];
+
+ if (args[1]) {
+ auto year = args[1].Get<std::conditional_t<TResourceName == TMResourceName, ui16, i32>>();
+ if (!ValidateYear<TResourceName>(year)) {
+ return TUnboxedValuePod();
+ }
+ SetYear<TResourceName>(result, year);
+ }
+ if (args[2]) {
+ auto month = args[2].Get<ui8>();
+ if (!ValidateMonth(month)) {
+ return TUnboxedValuePod();
+ }
+ SetMonth<TResourceName>(result, month);
+ }
+ if (args[3]) {
+ auto day = args[3].Get<ui8>();
+ if (!ValidateDay(day)) {
+ return TUnboxedValuePod();
+ }
+ SetDay<TResourceName>(result, day);
+ }
+ if (args[4]) {
+ auto hour = args[4].Get<ui8>();
+ if (!ValidateHour(hour)) {
+ return TUnboxedValuePod();
+ }
+ SetHour<TResourceName>(result, hour);
+ }
+ if (args[5]) {
+ auto minute = args[5].Get<ui8>();
+ if (!ValidateMinute(minute)) {
+ return TUnboxedValuePod();
+ }
+ SetMinute<TResourceName>(result, minute);
+ }
+ if (args[6]) {
+ auto second = args[6].Get<ui8>();
+ if (!ValidateSecond(second)) {
+ return TUnboxedValuePod();
+ }
+ SetSecond<TResourceName>(result, second);
+ }
+ if (args[7]) {
+ auto microsecond = args[7].Get<ui32>();
+ if (!ValidateMicrosecond(microsecond)) {
+ return TUnboxedValuePod();
+ }
+ SetMicrosecond<TResourceName>(result, microsecond);
+ }
+ if (args[8]) {
+ auto timezoneId = args[8].Get<ui16>();
+ if (!ValidateTimezoneId(timezoneId)) {
+ return TUnboxedValuePod();
+ }
+ SetTimezoneId<TResourceName>(result, timezoneId);
+ }
+
+ auto& builder = valueBuilder->GetDateBuilder();
+ auto& storage = Reference<TResourceName>(result);
+ if (!storage.Validate(builder)) {
+ return TUnboxedValuePod();
+ }
+ return result;
+ } catch (const std::exception& e) {
+ TStringBuilder sb;
+ sb << CurrentExceptionMessage();
+ sb << Endl << "[" << TStringBuf(Name()) << "]" ;
+ UdfTerminate(sb.c_str());
+ }
+ }
+
+ };
+
+ static void SetInvalidTypeError(NUdf::IFunctionTypeInfoBuilder& builder,
+ ITypeInfoHelper::TPtr typeInfoHelper, const TType* argType)
+ {
+ ::TStringBuilder sb;
+ sb << "Invalid argument type: got ";
+ TTypePrinter(*typeInfoHelper, argType).Out(sb.Out);
+ sb << ", but Resource<" << TMResourceName <<"> or Resource<"
+ << TM64ResourceName << "> expected";
+ builder.SetError(sb);
+ }
+
+ template<const char* TResourceName>
+ static void BuildSignature(NUdf::IFunctionTypeInfoBuilder& builder, bool typesOnly) {
+ builder.Returns<TOptional<TResource<TResourceName>>>();
+ builder.OptionalArgs(8).Args()->Add<TAutoMap<TResource<TResourceName>>>()
+ .template Add<TOptional<std::conditional_t<TResourceName == TMResourceName, ui16, i32>>>().Name("Year")
+ .template Add<TOptional<ui8>>().Name("Month")
+ .template Add<TOptional<ui8>>().Name("Day")
+ .template Add<TOptional<ui8>>().Name("Hour")
+ .template Add<TOptional<ui8>>().Name("Minute")
+ .template Add<TOptional<ui8>>().Name("Second")
+ .template Add<TOptional<ui32>>().Name("Microsecond")
+ .template Add<TOptional<ui16>>().Name("TimezoneId");
+ builder.IsStrict();
+ if (!typesOnly) {
+ builder.Implementation(new TImpl<TResourceName>());
+ }
+ }
};
// From*
diff --git a/yql/essentials/udfs/common/datetime2/test/canondata/test.test_Update_/results.txt b/yql/essentials/udfs/common/datetime2/test/canondata/test.test_Update_/results.txt
index 75dfcd0b39a..002d4c76306 100644
--- a/yql/essentials/udfs/common/datetime2/test/canondata/test.test_Update_/results.txt
+++ b/yql/essentials/udfs/common/datetime2/test/canondata/test.test_Update_/results.txt
@@ -8,227 +8,463 @@
"StructType";
[
[
- "column0";
+ "explicit";
[
- "OptionalType";
+ "StructType";
[
- "DataType";
- "String"
+ [
+ "inday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "insecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "intzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "ipdate";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unsecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "untzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "uptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
]
]
];
[
- "column1";
+ "implicit";
[
- "OptionalType";
+ "StructType";
[
- "DataType";
- "String"
+ [
+ "inday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "insecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "intzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "ipdate";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unsecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "untzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "uptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
]
]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2001-12-01T11:20:19.345678,GMT"
];
[
- "column2";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:10:19.345678,GMT"
];
[
- "column3";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:19.123456,GMT"
];
[
- "column4";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:09.345678,GMT"
];
[
- "column5";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:19.345678,America/Creston"
];
[
- "column6";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-20T21:20:19.345678,GMT"
];
[
- "column7";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-07-01T21:20:19.345678,GMT"
];
[
- "column8";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T11:10:09.345678,GMT"
];
[
- "column9";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2005-12-01T21:20:19.345678,GMT"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2001-12-01T11:20:19.345678,GMT"
];
[
- "column10";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:10:19.345678,GMT"
];
[
- "column11";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:19.123456,GMT"
];
[
- "column12";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:09.345678,GMT"
];
[
- "column13";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T21:20:19.345678,America/Creston"
];
[
- "column14";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-20T21:20:19.345678,GMT"
];
[
- "column15";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-07-01T21:20:19.345678,GMT"
];
[
- "column16";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2001-12-01T11:10:09.345678,GMT"
];
[
- "column17";
- [
- "OptionalType";
- [
- "DataType";
- "String"
- ]
- ]
+ "2005-12-01T21:20:19.345678,GMT"
]
]
]
- ];
- "Data" = [
- [
- [
- "2005-12-01T21:20:19.345678,GMT"
- ];
- #;
- [
- "2001-07-01T21:20:19.345678,GMT"
- ];
- #;
- [
- "2001-12-20T21:20:19.345678,GMT"
- ];
- #;
- #;
- [
- "2001-12-01T11:10:09.345678,GMT"
- ];
- [
- "2001-12-01T11:20:19.345678,GMT"
- ];
- #;
- [
- "2001-12-01T21:10:19.345678,GMT"
- ];
- #;
- [
- "2001-12-01T21:20:09.345678,GMT"
- ];
- #;
- [
- "2001-12-01T21:20:19.123456,GMT"
- ];
- #;
- [
- "2001-12-01T21:20:19.345678,America/Creston"
- ];
- #
- ]
]
}
]
diff --git a/yql/essentials/udfs/common/datetime2/test/cases/Update.sql b/yql/essentials/udfs/common/datetime2/test/cases/Update.sql
index 59221221b37..e67a5ecf565 100644
--- a/yql/essentials/udfs/common/datetime2/test/cases/Update.sql
+++ b/yql/essentials/udfs/common/datetime2/test/cases/Update.sql
@@ -1,25 +1,35 @@
/* syntax version 1 */
-SELECT
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 2005)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 2200 as Year)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, NULL, 7)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 13 as Month)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, NULL, NULL, 20)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 32 as Day)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 2018, 2, 30)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, NULL, NULL, NULL, 11, 10, 9)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 11 as Hour)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 24 as Hour)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 10 as Minute)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 60 as Minute)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 9 as Second)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 60 as Second)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 123456 as Microsecond)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 2000000 as Microsecond)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 100 as TimezoneId)) as String),
- cast(DateTime::MakeTzTimestamp(DateTime::Update(tm, 1000 as TimezoneId)) as String)
-from (
- select
- cast(ftztimestamp as TzTimestamp) as tm
- from Input
-);
+$check = ($arg) -> {
+ return <|
+ upyear: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 2005)) AS String),
+ inyear: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 2200 as Year)) AS String),
+ upmonth: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, NULL, 7)) AS String),
+ inmonth: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 13 as Month)) AS String),
+ upday: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, NULL, NULL, 20)) AS String),
+ inday: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 32 as Day)) AS String),
+ ipdate: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 2018, 2, 30)) AS String),
+ uptime: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, NULL, NULL, NULL, 11, 10, 9)) AS String),
+ unhour: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 11 as Hour)) AS String),
+ inhour: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 24 as Hour)) AS String),
+ unminute: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 10 as Minute)) AS String),
+ inminute: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 60 as Minute)) AS String),
+ unsecond: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 9 as Second)) AS String),
+ insecond: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 60 as Second)) AS String),
+ unmsec: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 123456 as Microsecond)) AS String),
+ inmsec: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 2000000 as Microsecond)) AS String),
+ untzid: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 100 as TimezoneId)) AS String),
+ intzid: CAST(DateTime::MakeTzTimestamp(DateTime::Update($arg, 1000 as TimezoneId)) AS String),
+ |>
+};
+
+$typeDispatcher = ($row) -> {
+ $tm = $row.tm;
+ return <|
+ explicit: $check(DateTime::Split($tm)),
+ implicit: $check($tm),
+ |>;
+};
+
+$input = SELECT CAST(ftztimestamp AS TzTimestamp) as tm FROM Input;
+
+PROCESS $input USING $typeDispatcher(TableRow());
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/result.json b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/result.json
index 7ac2c62c4ad..01840317a7d 100644
--- a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/result.json
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/result.json
@@ -28,5 +28,15 @@
{
"uri": "file://test.test_StartOf_/results.txt"
}
+ ],
+ "test.test[UpdateTz]": [
+ {
+ "uri": "file://test.test_UpdateTz_/results.txt"
+ }
+ ],
+ "test.test[Update]": [
+ {
+ "uri": "file://test.test_Update_/results.txt"
+ }
]
}
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_UpdateTz_/results.txt b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_UpdateTz_/results.txt
new file mode 100644
index 00000000000..763afc4374d
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_UpdateTz_/results.txt
@@ -0,0 +1,64 @@
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "column0";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ [
+ "2025-02-16T21:00:00Z"
+ ]
+ ]
+ ]
+ }
+ ]
+ };
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "column0";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ [
+ "2025-02-16T21:00:00Z"
+ ]
+ ]
+ ]
+ }
+ ]
+ }
+] \ No newline at end of file
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_Update_/results.txt b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_Update_/results.txt
new file mode 100644
index 00000000000..4449395d3cf
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_Update_/results.txt
@@ -0,0 +1,1110 @@
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "explicit";
+ [
+ "StructType";
+ [
+ [
+ "inday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "insecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "intzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "ipdate";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "iptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unsecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "untzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "update";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "uptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "implicit";
+ [
+ "StructType";
+ [
+ [
+ "inday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "insecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "intzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "inyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "ipdate";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "iptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unhour";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unminute";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unmsec";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "unsecond";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "untzid";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "update";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upmonth";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "uptime";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "upyear";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "-144169-01-01T19:00:00Z"
+ ];
+ [
+ "-144169-01-01T00:24:00Z"
+ ];
+ [
+ "-144169-01-01T00:00:00.123456Z"
+ ];
+ [
+ "-144169-01-01T00:00:09Z"
+ ];
+ #;
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "-144169-01-17T00:00:00Z"
+ ];
+ [
+ "-144169-02-01T00:00:00Z"
+ ];
+ [
+ "-144169-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "-144169-01-01T19:00:00Z"
+ ];
+ [
+ "-144169-01-01T00:24:00Z"
+ ];
+ [
+ "-144169-01-01T00:00:00.123456Z"
+ ];
+ [
+ "-144169-01-01T00:00:09Z"
+ ];
+ #;
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "-144169-01-17T00:00:00Z"
+ ];
+ [
+ "-144169-02-01T00:00:00Z"
+ ];
+ [
+ "-144169-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "-1-01-01T19:59:59.999999Z"
+ ];
+ [
+ "-1-01-01T23:24:59.999999Z"
+ ];
+ [
+ "-1-01-01T23:59:59.123456Z"
+ ];
+ [
+ "-1-01-01T23:59:09.999999Z"
+ ];
+ [
+ "-1-01-01T21:29:42.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "-1-01-17T23:59:59.999999Z"
+ ];
+ [
+ "-1-02-01T23:59:59.999999Z"
+ ];
+ [
+ "-1-01-01T19:24:09.999999Z"
+ ];
+ [
+ "2025-01-01T23:59:59.999999Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "-1-01-01T19:59:59.999999Z"
+ ];
+ [
+ "-1-01-01T23:24:59.999999Z"
+ ];
+ [
+ "-1-01-01T23:59:59.123456Z"
+ ];
+ [
+ "-1-01-01T23:59:09.999999Z"
+ ];
+ [
+ "-1-01-01T21:29:42.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "-1-01-17T23:59:59.999999Z"
+ ];
+ [
+ "-1-02-01T23:59:59.999999Z"
+ ];
+ [
+ "-1-01-01T19:24:09.999999Z"
+ ];
+ [
+ "2025-01-01T23:59:59.999999Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1-01-01T19:00:00Z"
+ ];
+ [
+ "1-01-01T00:24:00Z"
+ ];
+ [
+ "1-01-01T00:00:00.123456Z"
+ ];
+ [
+ "1-01-01T00:00:09Z"
+ ];
+ [
+ "-1-12-31T21:29:43Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "1-01-17T00:00:00Z"
+ ];
+ [
+ "1-02-01T00:00:00Z"
+ ];
+ [
+ "1-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1-01-01T19:00:00Z"
+ ];
+ [
+ "1-01-01T00:24:00Z"
+ ];
+ [
+ "1-01-01T00:00:00.123456Z"
+ ];
+ [
+ "1-01-01T00:00:09Z"
+ ];
+ [
+ "-1-12-31T21:29:43Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "1-01-17T00:00:00Z"
+ ];
+ [
+ "1-02-01T00:00:00Z"
+ ];
+ [
+ "1-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1969-12-31T19:59:59.999999Z"
+ ];
+ [
+ "1969-12-31T23:24:59.999999Z"
+ ];
+ [
+ "1969-12-31T23:59:59.123456Z"
+ ];
+ [
+ "1969-12-31T23:59:09.999999Z"
+ ];
+ [
+ "1969-12-31T20:59:59.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "1969-12-17T23:59:59.999999Z"
+ ];
+ #;
+ [
+ "1969-12-31T19:24:09.999999Z"
+ ];
+ [
+ "2025-12-31T23:59:59.999999Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1969-12-31T19:59:59.999999Z"
+ ];
+ [
+ "1969-12-31T23:24:59.999999Z"
+ ];
+ [
+ "1969-12-31T23:59:59.123456Z"
+ ];
+ [
+ "1969-12-31T23:59:09.999999Z"
+ ];
+ [
+ "1969-12-31T20:59:59.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "1969-12-17T23:59:59.999999Z"
+ ];
+ #;
+ [
+ "1969-12-31T19:24:09.999999Z"
+ ];
+ [
+ "2025-12-31T23:59:59.999999Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1970-01-01T19:00:00Z"
+ ];
+ [
+ "1970-01-01T00:24:00Z"
+ ];
+ [
+ "1970-01-01T00:00:00.123456Z"
+ ];
+ [
+ "1970-01-01T00:00:09Z"
+ ];
+ [
+ "1969-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "1970-01-17T00:00:00Z"
+ ];
+ [
+ "1970-02-01T00:00:00Z"
+ ];
+ [
+ "1970-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "1970-01-01T19:00:00Z"
+ ];
+ [
+ "1970-01-01T00:24:00Z"
+ ];
+ [
+ "1970-01-01T00:00:00.123456Z"
+ ];
+ [
+ "1970-01-01T00:00:09Z"
+ ];
+ [
+ "1969-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "1970-01-17T00:00:00Z"
+ ];
+ [
+ "1970-02-01T00:00:00Z"
+ ];
+ [
+ "1970-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2025-01-01T19:00:00Z"
+ ];
+ [
+ "2025-01-01T00:24:00Z"
+ ];
+ [
+ "2025-01-01T00:00:00.123456Z"
+ ];
+ [
+ "2025-01-01T00:00:09Z"
+ ];
+ [
+ "2024-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "2025-01-17T00:00:00Z"
+ ];
+ [
+ "2025-02-01T00:00:00Z"
+ ];
+ [
+ "2025-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2025-01-01T19:00:00Z"
+ ];
+ [
+ "2025-01-01T00:24:00Z"
+ ];
+ [
+ "2025-01-01T00:00:00.123456Z"
+ ];
+ [
+ "2025-01-01T00:00:09Z"
+ ];
+ [
+ "2024-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "2025-01-17T00:00:00Z"
+ ];
+ [
+ "2025-02-01T00:00:00Z"
+ ];
+ [
+ "2025-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2106-01-01T19:00:00Z"
+ ];
+ [
+ "2106-01-01T00:24:00Z"
+ ];
+ [
+ "2106-01-01T00:00:00.123456Z"
+ ];
+ [
+ "2106-01-01T00:00:09Z"
+ ];
+ [
+ "2105-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "2106-01-17T00:00:00Z"
+ ];
+ [
+ "2106-02-01T00:00:00Z"
+ ];
+ [
+ "2106-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "2106-01-01T19:00:00Z"
+ ];
+ [
+ "2106-01-01T00:24:00Z"
+ ];
+ [
+ "2106-01-01T00:00:00.123456Z"
+ ];
+ [
+ "2106-01-01T00:00:09Z"
+ ];
+ [
+ "2105-12-31T21:00:00Z"
+ ];
+ [
+ "2025-02-17T00:00:00Z"
+ ];
+ [
+ "2106-01-17T00:00:00Z"
+ ];
+ [
+ "2106-02-01T00:00:00Z"
+ ];
+ [
+ "2106-01-01T19:24:09Z"
+ ];
+ [
+ "2025-01-01T00:00:00Z"
+ ]
+ ]
+ ];
+ [
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "148107-12-31T19:59:59.999999Z"
+ ];
+ [
+ "148107-12-31T23:24:59.999999Z"
+ ];
+ [
+ "148107-12-31T23:59:59.123456Z"
+ ];
+ [
+ "148107-12-31T23:59:09.999999Z"
+ ];
+ [
+ "148107-12-31T20:59:59.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "148107-12-17T23:59:59.999999Z"
+ ];
+ #;
+ [
+ "148107-12-31T19:24:09.999999Z"
+ ];
+ [
+ "2025-12-31T23:59:59.999999Z"
+ ]
+ ];
+ [
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ #;
+ [
+ "148107-12-31T19:59:59.999999Z"
+ ];
+ [
+ "148107-12-31T23:24:59.999999Z"
+ ];
+ [
+ "148107-12-31T23:59:59.123456Z"
+ ];
+ [
+ "148107-12-31T23:59:09.999999Z"
+ ];
+ [
+ "148107-12-31T20:59:59.999999Z"
+ ];
+ [
+ "2025-02-17T23:59:59.999999Z"
+ ];
+ [
+ "148107-12-17T23:59:59.999999Z"
+ ];
+ #;
+ [
+ "148107-12-31T19:24:09.999999Z"
+ ];
+ [
+ "2025-12-31T23:59:59.999999Z"
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ }
+] \ No newline at end of file
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.cfg b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.cfg
new file mode 100644
index 00000000000..73382ef1be0
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.cfg
@@ -0,0 +1 @@
+in plato.Input Update.in
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in
new file mode 100644
index 00000000000..4eb94e06a48
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in
@@ -0,0 +1,8 @@
+{"ftimestamp64"="-144169-01-01T00:00:00.000000Z"};
+{"ftimestamp64"="-1-01-01T23:59:59.999999Z"};
+{"ftimestamp64"="1-01-01T00:00:00.000000Z"};
+{"ftimestamp64"="1969-12-31T23:59:59.999999Z"};
+{"ftimestamp64"="1970-01-01T00:00:00.000000Z"};
+{"ftimestamp64"="2025-01-01T00:00:00.000000Z"};
+{"ftimestamp64"="2106-01-01T00:00:00.000000Z"};
+{"ftimestamp64"="148107-12-31T23:59:59.999999Z"};
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in.attr b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in.attr
new file mode 100644
index 00000000000..91994000ceb
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.in.attr
@@ -0,0 +1,16 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "ftimestamp64";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.sql b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.sql
new file mode 100644
index 00000000000..2c7e19865fe
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/Update.sql
@@ -0,0 +1,37 @@
+/* syntax version 1 */
+$check = ($arg) -> {
+ return <|
+ upyear: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 2025)) AS String),
+ inyear: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 148108 as Year)) AS String),
+ upmonth: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, NULL, 2)) AS String),
+ inmonth: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 13 as Month)) AS String),
+ upday: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, NULL, NULL, 17)) AS String),
+ inday: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 32 as Day)) AS String),
+ update: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 2025, 2, 17)) AS String),
+ ipdate: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 2025, 2, 29)) AS String),
+ uptime: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, NULL, NULL, NULL, 19, 24, 9)) AS String),
+ iptime: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, NULL, NULL, NULL, 25, 60, 61)) AS String),
+ unhour: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 19 as Hour)) AS String),
+ inhour: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 24 as Hour)) AS String),
+ unminute: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 24 as Minute)) AS String),
+ inminute: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 60 as Minute)) AS String),
+ unsecond: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 9 as Second)) AS String),
+ insecond: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 60 as Second)) AS String),
+ unmsec: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 123456 as Microsecond)) AS String),
+ inmsec: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 1234567 as Microsecond)) AS String),
+ untzid: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 1 as TimezoneId)) AS String),
+ intzid: CAST(DateTime::MakeTimestamp64(DateTime::Update($arg, 1000 as TimezoneId)) AS String),
+ |>
+};
+
+$typeDispatcher = ($row) -> {
+ $tm = $row.tm;
+ return <|
+ explicit: $check(DateTime::Split($tm)),
+ implicit: $check($tm),
+ |>;
+};
+
+$input = SELECT CAST(ftimestamp64 AS Timestamp64) as tm FROM Input;
+
+PROCESS $input USING $typeDispatcher(TableRow());
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/UpdateTz.sql b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/UpdateTz.sql
new file mode 100644
index 00000000000..2fa7c48c7e5
--- /dev/null
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/UpdateTz.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+pragma warning("disable","4510");
+SELECT CAST(DateTime::MakeDatetime64(DateTime::Update(
+ CAST("2025-02-17T00:00:00Z" AS Datetime64), Yql::TimezoneId("Europe/Moscow") as TimezoneId)
+) AS String);
+
+SELECT CAST(DateTime::MakeDatetime64(DateTime::Update(
+ CAST("2025-02-17T00:00:00Z" AS Datetime64), "Europe/Moscow" as Timezone)
+) AS String);