diff options
| author | imunkin <[email protected]> | 2025-02-18 18:13:04 +0300 |
|---|---|---|
| committer | imunkin <[email protected]> | 2025-02-18 18:52:09 +0300 |
| commit | add906303b66ed6c98751c33c4806d398662be2f (patch) | |
| tree | 2c394721fb31d6783209452c69bd4e043e44de3e /yql/essentials/udfs | |
| parent | 92ee8c57eca250bf8648398e0cd69031f9768275 (diff) | |
YQL-18303: Introduce Update overload
commit_hash:3afbcdd00ad47ecf35cb29bb25a5d7658ed1d5cb
Diffstat (limited to 'yql/essentials/udfs')
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); |
