aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs
diff options
context:
space:
mode:
authorimunkin <imunkin@yandex-team.com>2025-02-24 12:00:27 +0300
committerimunkin <imunkin@yandex-team.com>2025-02-24 12:18:41 +0300
commit34cd625c20a22ff9a875012ece2d2d77945afb6a (patch)
tree72c1158c4fc4fbda9d31579a75d9b5588fe611ce /yql/essentials/udfs
parent82c8034927cd716ac531fdc9edc97c4437704e51 (diff)
downloadydb-34cd625c20a22ff9a875012ece2d2d77945afb6a.tar.gz
YQL-18303: Introduce StartOf/EndOf/TimeOfDay overloads
commit_hash:ed323f55ce6ca64b9a912772866d7bfb4fc1235f
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_bigdates/canondata/test.test_EndOf_/results.txt328
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_StartOf_/results.txt408
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/EndOf.sql5
-rw-r--r--yql/essentials/udfs/common/datetime2/test_bigdates/cases/StartOf.sql6
5 files changed, 999 insertions, 25 deletions
diff --git a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
index edc65c12a2..61ee555e56 100644
--- a/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
+++ b/yql/essentials/udfs/common/datetime2/datetime_udf.cpp
@@ -37,11 +37,13 @@ extern const char StartOfQuarterUDF[] = "StartOfQuarter";
extern const char StartOfMonthUDF[] = "StartOfMonth";
extern const char StartOfWeekUDF[] = "StartOfWeek";
extern const char StartOfDayUDF[] = "StartOfDay";
+extern const char StartOfUDF[] = "StartOf";
extern const char EndOfYearUDF[] = "EndOfYear";
extern const char EndOfQuarterUDF[] = "EndOfQuarter";
extern const char EndOfMonthUDF[] = "EndOfMonth";
extern const char EndOfWeekUDF[] = "EndOfWeek";
extern const char EndOfDayUDF[] = "EndOfDay";
+extern const char EndOfUDF[] = "EndOf";
extern const char ShiftYearsUDF[] = "ShiftYears";
extern const char ShiftQuartersUDF[] = "ShiftQuarters";
extern const char ShiftMonthsUDF[] = "ShiftMonths";
@@ -1981,7 +1983,8 @@ private:
return storage;
}
- TMaybe<TTMStorage> StartOf(TTMStorage storage, ui64 interval, const IValueBuilder& valueBuilder) {
+ template<typename TStorage>
+ TMaybe<TStorage> StartOf(TStorage storage, ui64 interval, const IValueBuilder& valueBuilder) {
if (interval >= 86400000000ull) {
// treat as StartOfDay
SetStartOfDay(storage);
@@ -1998,7 +2001,8 @@ private:
return storage;
}
- TMaybe<TTMStorage> EndOf(TTMStorage storage, ui64 interval, const IValueBuilder& valueBuilder) {
+ template<typename TStorage>
+ TMaybe<TStorage> EndOf(TStorage storage, ui64 interval, const IValueBuilder& valueBuilder) {
if (interval >= 86400000000ull) {
// treat as EndOfDay
SetEndOfDay(storage);
@@ -2026,7 +2030,7 @@ private:
return;
}
- if (auto res = (UseEnd ? EndOf : StartOf)(storage, interval, *valueBuilder)) {
+ if (auto res = (UseEnd ? EndOf<TTMStorage> : StartOf<TTMStorage>)(storage, interval, *valueBuilder)) {
storage = res.GetRef();
sink(arg1);
} else {
@@ -2035,33 +2039,141 @@ private:
}
};
- BEGIN_SIMPLE_STRICT_ARROW_UDF(TStartOf, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, TAutoMap<TInterval>)) {
+ template<const char* TResourceName, auto Core>
+ TUnboxedValue SimpleDatetimeToIntervalUdf(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) {
auto result = args[0];
ui64 interval = std::abs(args[1].Get<i64>());
if (interval == 0) {
return result;
}
- if (auto res = StartOf(Reference(result), interval, *valueBuilder)) {
- Reference(result) = res.GetRef();
+ auto& storage = Reference<TResourceName>(result);
+ if (auto res = Core(storage, interval, *valueBuilder)) {
+ storage = res.GetRef();
return result;
}
return TUnboxedValuePod{};
}
- END_SIMPLE_ARROW_UDF(TStartOf, TStartEndOfBinaryKernelExec<false>::Do);
- BEGIN_SIMPLE_STRICT_ARROW_UDF(TEndOf, TOptional<TResource<TMResourceName>>(TAutoMap<TResource<TMResourceName>>, TAutoMap<TInterval>)) {
- auto result = args[0];
- ui64 interval = std::abs(args[1].Get<i64>());
- if (interval == 0) {
- return result;
+template<const char* TUdfName, auto Boundary, auto WBoundary>
+class TBoundaryOfInterval: public ::NYql::NUdf::TBoxedValue {
+public:
+ typedef bool TTypeAwareMarker;
+ static const TStringRef& Name() {
+ static auto name = TStringRef(TUdfName, std::strlen(TUdfName));
+ return name;
+ }
+
+ static bool DeclareSignature(
+ const ::NYql::NUdf::TStringRef& name,
+ ::NYql::NUdf::TType* userType,
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder,
+ bool typesOnly)
+ {
+ if (Name() != name) {
+ return false;
}
- if (auto res = EndOf(Reference(result), interval, *valueBuilder)) {
- Reference(result) = res.GetRef();
- return result;
+
+ if (!userType) {
+ builder.SetError("User type is missing");
+ return true;
}
- return TUnboxedValuePod{};
+
+ builder.UserType(userType);
+
+ 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");
+
+ TTupleTypeInspector argsTuple(*typeInfoHelper, tuple.GetElementType(0));
+ Y_ENSURE(argsTuple, "Tuple with args expected");
+ if (argsTuple.GetElementsCount() != 2) {
+ builder.SetError("Single argument expected");
+ return true;
+ }
+
+ 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, WBoundary>(builder, typesOnly);
+ return true;
+ }
+ if (features & (NUdf::DateType | NUdf::TzDateType)) {
+ BuildSignature<TMResourceName, Boundary>(builder, typesOnly);
+ return true;
+ }
+
+ SetInvalidTypeError(builder, typeInfoHelper, argType);
+ return true;
+ }
+
+ if (resource.GetTag() == TStringRef::Of(TM64ResourceName)) {
+ BuildSignature<TM64ResourceName, WBoundary>(builder, typesOnly);
+ return true;
+ }
+
+ if (resource.GetTag() == TStringRef::Of(TMResourceName)) {
+ BuildSignature<TMResourceName, Boundary>(builder, typesOnly);
+ return true;
+ }
+
+ ::TStringBuilder sb;
+ sb << "Unexpected Resource tag: got '" << resource.GetTag() << "'";
+ builder.SetError(sb);
+ return true;
}
- END_SIMPLE_ARROW_UDF(TEndOf, TStartEndOfBinaryKernelExec<true>::Do);
+private:
+ template<auto Func>
+ class TImpl : public TBoxedValue {
+ public:
+ TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const final {
+ try {
+ return Func(valueBuilder, args);
+ } catch (const std::exception&) {
+ 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, auto Func>
+ static void BuildSignature(NUdf::IFunctionTypeInfoBuilder& builder, bool typesOnly) {
+ builder.Returns<TOptional<TResource<TResourceName>>>();
+ builder.Args()->Add<TAutoMap<TResource<TResourceName>>>()
+ .template Add<TAutoMap<std::conditional_t<TResourceName == TMResourceName, TInterval, TInterval64>>>();
+ builder.IsStrict();
+ if (!typesOnly) {
+ builder.Implementation(new TImpl<Func>());
+ }
+ }
+};
struct TTimeOfDayKernelExec : TUnaryKernelExec<TTimeOfDayKernelExec, TReaderTraits::TResource<false>, TFixedSizeArrayBuilder<TDataType<TInterval>::TLayout, false>> {
template<typename TSink>
@@ -2072,13 +2184,126 @@ private:
}
};
- const auto timeOfDayKernelExecDo = TTimeOfDayKernelExec::Do;
- BEGIN_SIMPLE_STRICT_ARROW_UDF(TTimeOfDay, TInterval(TAutoMap<TResource<TMResourceName>>)) {
- Y_UNUSED(valueBuilder);
- auto& storage = Reference(args[0]);
- return TUnboxedValuePod((i64)storage.ToTimeOfDay());
+class TTimeOfDay: public ::NYql::NUdf::TBoxedValue {
+public:
+ typedef bool TTypeAwareMarker;
+ static const ::NYql::NUdf::TStringRef& Name() {
+ static auto name = TStringRef::Of("TimeOfDay");
+ return name;
}
- END_SIMPLE_ARROW_UDF(TTimeOfDay, timeOfDayKernelExecDo);
+
+ static bool DeclareSignature(
+ const ::NYql::NUdf::TStringRef& name,
+ ::NYql::NUdf::TType* userType,
+ ::NYql::NUdf::IFunctionTypeInfoBuilder& builder,
+ bool typesOnly)
+ {
+ if (Name() != name) {
+ return false;
+ }
+
+ if (!userType) {
+ builder.SetError("User type is missing");
+ return true;
+ }
+
+ builder.UserType(userType);
+
+ 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");
+
+ TTupleTypeInspector argsTuple(*typeInfoHelper, tuple.GetElementType(0));
+ Y_ENSURE(argsTuple, "Tuple with args expected");
+ if (argsTuple.GetElementsCount() != 1) {
+ builder.SetError("Single argument expected");
+ return true;
+ }
+
+ 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 {
+ Y_UNUSED(valueBuilder);
+ auto& storage = Reference<TResourceName>(args[0]);
+ return TUnboxedValuePod((i64)storage.ToTimeOfDay());
+ } catch (const std::exception&) {
+ 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<std::conditional_t<TResourceName == TMResourceName, TInterval, TInterval64>>();
+ builder.Args()->Add<TAutoMap<TResource<TResourceName>>>();
+ builder.IsStrict();
+ if (!typesOnly) {
+ builder.Implementation(new TImpl<TResourceName>());
+ }
+ }
+};
// Add ...
@@ -2959,7 +3184,8 @@ private:
SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfWeek<TTM64Storage>>>,
TBoundaryOf<StartOfDayUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, StartOfDay<TTMStorage>>,
SimpleDatetimeToDatetimeUdf<TM64ResourceName, StartOfDay<TTM64Storage>>>,
- TStartOf,
+ TBoundaryOfInterval<StartOfUDF, SimpleDatetimeToIntervalUdf<TMResourceName, StartOf<TTMStorage>>,
+ SimpleDatetimeToIntervalUdf<TM64ResourceName, StartOf<TTM64Storage>>>,
TTimeOfDay,
TShift<ShiftYearsUDF, DoAddYears<TMResourceName>, DoAddYears<TM64ResourceName>>,
@@ -2976,7 +3202,8 @@ private:
SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfWeek<TTM64Storage>>>,
TBoundaryOf<EndOfDayUDF, SimpleDatetimeToDatetimeUdf<TMResourceName, EndOfDay<TTMStorage>>,
SimpleDatetimeToDatetimeUdf<TM64ResourceName, EndOfDay<TTM64Storage>>>,
- TEndOf,
+ TBoundaryOfInterval<EndOfUDF, SimpleDatetimeToIntervalUdf<TMResourceName, EndOf<TTMStorage>>,
+ SimpleDatetimeToIntervalUdf<TM64ResourceName, EndOf<TTM64Storage>>>,
TToUnits<ToSecondsUDF, ui32, 1>,
TToUnits<ToMillisecondsUDF, ui64, 1000>,
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_EndOf_/results.txt b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_EndOf_/results.txt
index 1dc768bfd5..42f6cef30c 100644
--- a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_EndOf_/results.txt
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_EndOf_/results.txt
@@ -61,6 +61,56 @@
"Timestamp64"
]
]
+ ];
+ [
+ "sopt13h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt15m";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt20s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt4h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt7s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
]
]
]
@@ -119,6 +169,56 @@
"Timestamp64"
]
]
+ ];
+ [
+ "sopt13h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt15m";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt20s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt4h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt7s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
]
]
]
@@ -143,6 +243,21 @@
];
[
"-4611638275200000001"
+ ];
+ [
+ "-4611669850800000001"
+ ];
+ [
+ "-4611669893100000001"
+ ];
+ [
+ "-4611669893860000001"
+ ];
+ [
+ "-4611669883200000001"
+ ];
+ [
+ "-4611669893876000001"
]
];
[
@@ -160,6 +275,21 @@
];
[
"-4611638275200000001"
+ ];
+ [
+ "-4611669850800000001"
+ ];
+ [
+ "-4611669893100000001"
+ ];
+ [
+ "-4611669893860000001"
+ ];
+ [
+ "-4611669883200000001"
+ ];
+ [
+ "-4611669893876000001"
]
]
];
@@ -179,6 +309,19 @@
];
[
"-62135596800000001"
+ ];
+ #;
+ [
+ "-62167132800000001"
+ ];
+ [
+ "-62167132860000001"
+ ];
+ [
+ "-62167132800000001"
+ ];
+ [
+ "-62167132862000001"
]
];
[
@@ -196,6 +339,19 @@
];
[
"-62135596800000001"
+ ];
+ #;
+ [
+ "-62167132800000001"
+ ];
+ [
+ "-62167132860000001"
+ ];
+ [
+ "-62167132800000001"
+ ];
+ [
+ "-62167132862000001"
]
]
];
@@ -215,6 +371,21 @@
];
[
"-62104060800000001"
+ ];
+ [
+ "-62135550000000001"
+ ];
+ [
+ "-62135563500000001"
+ ];
+ [
+ "-62135563840000001"
+ ];
+ [
+ "-62135553600000001"
+ ];
+ [
+ "-62135563844000001"
]
];
[
@@ -232,6 +403,21 @@
];
[
"-62104060800000001"
+ ];
+ [
+ "-62135550000000001"
+ ];
+ [
+ "-62135563500000001"
+ ];
+ [
+ "-62135563840000001"
+ ];
+ [
+ "-62135553600000001"
+ ];
+ [
+ "-62135563844000001"
]
]
];
@@ -251,6 +437,19 @@
];
[
"-1"
+ ];
+ #;
+ [
+ "-1"
+ ];
+ [
+ "-60000001"
+ ];
+ [
+ "-1"
+ ];
+ [
+ "-62000001"
]
];
[
@@ -268,6 +467,19 @@
];
[
"-1"
+ ];
+ #;
+ [
+ "-1"
+ ];
+ [
+ "-60000001"
+ ];
+ [
+ "-1"
+ ];
+ [
+ "-62000001"
]
]
];
@@ -287,6 +499,21 @@
];
[
"31535999999999"
+ ];
+ [
+ "46799999999"
+ ];
+ [
+ "33299999999"
+ ];
+ [
+ "32959999999"
+ ];
+ [
+ "43199999999"
+ ];
+ [
+ "32955999999"
]
];
[
@@ -304,6 +531,21 @@
];
[
"31535999999999"
+ ];
+ [
+ "46799999999"
+ ];
+ [
+ "33299999999"
+ ];
+ [
+ "32959999999"
+ ];
+ [
+ "43199999999"
+ ];
+ [
+ "32955999999"
]
]
];
@@ -323,6 +565,21 @@
];
[
"1767225599999999"
+ ];
+ [
+ "1738673999999999"
+ ];
+ [
+ "1738660499999999"
+ ];
+ [
+ "1738660159999999"
+ ];
+ [
+ "1738670399999999"
+ ];
+ [
+ "1738660155999999"
]
];
[
@@ -340,6 +597,21 @@
];
[
"1767225599999999"
+ ];
+ [
+ "1738673999999999"
+ ];
+ [
+ "1738660499999999"
+ ];
+ [
+ "1738660159999999"
+ ];
+ [
+ "1738670399999999"
+ ];
+ [
+ "1738660155999999"
]
]
];
@@ -359,6 +631,21 @@
];
[
"4323283199999999"
+ ];
+ [
+ "4291793999999999"
+ ];
+ [
+ "4291780499999999"
+ ];
+ [
+ "4291780159999999"
+ ];
+ [
+ "4291790399999999"
+ ];
+ [
+ "4291780155999999"
]
];
[
@@ -376,6 +663,21 @@
];
[
"4323283199999999"
+ ];
+ [
+ "4291793999999999"
+ ];
+ [
+ "4291780499999999"
+ ];
+ [
+ "4291780159999999"
+ ];
+ [
+ "4291790399999999"
+ ];
+ [
+ "4291780155999999"
]
]
];
@@ -393,6 +695,19 @@
#;
[
"4611669811199999999"
+ ];
+ #;
+ [
+ "4611669811199999999"
+ ];
+ [
+ "4611669811139999999"
+ ];
+ [
+ "4611669811199999999"
+ ];
+ [
+ "4611669811137999999"
]
];
[
@@ -408,6 +723,19 @@
#;
[
"4611669811199999999"
+ ];
+ #;
+ [
+ "4611669811199999999"
+ ];
+ [
+ "4611669811139999999"
+ ];
+ [
+ "4611669811199999999"
+ ];
+ [
+ "4611669811137999999"
]
]
]
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_StartOf_/results.txt b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_StartOf_/results.txt
index 8d83a5788c..52bd1cbf87 100644
--- a/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_StartOf_/results.txt
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/canondata/test.test_StartOf_/results.txt
@@ -33,6 +33,56 @@
]
];
[
+ "sopt13h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt15m";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt20s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt4h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt7s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
"soquarter";
[
"OptionalType";
@@ -61,6 +111,16 @@
"Timestamp64"
]
]
+ ];
+ [
+ "timeofday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Interval64"
+ ]
+ ]
]
]
]
@@ -91,6 +151,56 @@
]
];
[
+ "sopt13h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt15m";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt20s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt4h";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
+ "sopt7s";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Timestamp64"
+ ]
+ ]
+ ];
+ [
"soquarter";
[
"OptionalType";
@@ -119,6 +229,16 @@
"Timestamp64"
]
]
+ ];
+ [
+ "timeofday";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Interval64"
+ ]
+ ]
]
]
]
@@ -138,9 +258,27 @@
[
"-4611669897600000000"
];
+ [
+ "-4611669894000000000"
+ ];
+ [
+ "-4611669893880000000"
+ ];
+ [
+ "-4611669897600000000"
+ ];
+ [
+ "-4611669893883000000"
+ ];
+ [
+ "-4611669897600000000"
+ ];
#;
[
"-4611669897600000000"
+ ];
+ [
+ "3723456789"
]
];
[
@@ -153,9 +291,27 @@
[
"-4611669897600000000"
];
+ [
+ "-4611669894000000000"
+ ];
+ [
+ "-4611669893880000000"
+ ];
+ [
+ "-4611669897600000000"
+ ];
+ [
+ "-4611669893883000000"
+ ];
+ [
+ "-4611669897600000000"
+ ];
#;
[
"-4611669897600000000"
+ ];
+ [
+ "3723456789"
]
]
];
@@ -168,11 +324,29 @@
"-62167219200000000"
];
[
+ "-62167172400000000"
+ ];
+ [
+ "-62167133700000000"
+ ];
+ [
+ "-62167132880000000"
+ ];
+ [
+ "-62167147200000000"
+ ];
+ [
+ "-62167132869000000"
+ ];
+ [
"-62167219200000000"
];
#;
[
"-62167219200000000"
+ ];
+ [
+ "86337654321"
]
];
[
@@ -183,11 +357,29 @@
"-62167219200000000"
];
[
+ "-62167172400000000"
+ ];
+ [
+ "-62167133700000000"
+ ];
+ [
+ "-62167132880000000"
+ ];
+ [
+ "-62167147200000000"
+ ];
+ [
+ "-62167132869000000"
+ ];
+ [
"-62167219200000000"
];
#;
[
"-62167219200000000"
+ ];
+ [
+ "86337654321"
]
]
];
@@ -202,9 +394,27 @@
[
"-62135596800000000"
];
+ [
+ "-62135564400000000"
+ ];
+ [
+ "-62135563860000000"
+ ];
+ [
+ "-62135568000000000"
+ ];
+ [
+ "-62135563851000000"
+ ];
+ [
+ "-62135596800000000"
+ ];
#;
[
"-62135596800000000"
+ ];
+ [
+ "32949000009"
]
];
[
@@ -217,9 +427,27 @@
[
"-62135596800000000"
];
+ [
+ "-62135564400000000"
+ ];
+ [
+ "-62135563860000000"
+ ];
+ [
+ "-62135568000000000"
+ ];
+ [
+ "-62135563851000000"
+ ];
+ [
+ "-62135596800000000"
+ ];
#;
[
"-62135596800000000"
+ ];
+ [
+ "32949000009"
]
]
];
@@ -232,11 +460,29 @@
"-2678400000000"
];
[
+ "-39600000000"
+ ];
+ [
+ "-900000000"
+ ];
+ [
+ "-80000000"
+ ];
+ [
+ "-14400000000"
+ ];
+ [
+ "-69000000"
+ ];
+ [
"-7948800000000"
];
#;
[
"-31536000000000"
+ ];
+ [
+ "86337654321"
]
];
[
@@ -247,11 +493,29 @@
"-2678400000000"
];
[
+ "-39600000000"
+ ];
+ [
+ "-900000000"
+ ];
+ [
+ "-80000000"
+ ];
+ [
+ "-14400000000"
+ ];
+ [
+ "-69000000"
+ ];
+ [
"-7948800000000"
];
#;
[
"-31536000000000"
+ ];
+ [
+ "86337654321"
]
]
];
@@ -266,9 +530,27 @@
[
"0"
];
+ [
+ "32400000000"
+ ];
+ [
+ "32940000000"
+ ];
+ [
+ "28800000000"
+ ];
+ [
+ "32949000000"
+ ];
+ [
+ "0"
+ ];
#;
[
"0"
+ ];
+ [
+ "32949000009"
]
];
[
@@ -281,9 +563,27 @@
[
"0"
];
+ [
+ "32400000000"
+ ];
+ [
+ "32940000000"
+ ];
+ [
+ "28800000000"
+ ];
+ [
+ "32949000000"
+ ];
+ [
+ "0"
+ ];
#;
[
"0"
+ ];
+ [
+ "32949000009"
]
]
];
@@ -296,6 +596,21 @@
"1738368000000000"
];
[
+ "1738627200000000"
+ ];
+ [
+ "1738659600000000"
+ ];
+ [
+ "1738660140000000"
+ ];
+ [
+ "1738656000000000"
+ ];
+ [
+ "1738660149000000"
+ ];
+ [
"1735689600000000"
];
[
@@ -303,6 +618,9 @@
];
[
"1735689600000000"
+ ];
+ [
+ "32949000009"
]
];
[
@@ -313,6 +631,21 @@
"1738368000000000"
];
[
+ "1738627200000000"
+ ];
+ [
+ "1738659600000000"
+ ];
+ [
+ "1738660140000000"
+ ];
+ [
+ "1738656000000000"
+ ];
+ [
+ "1738660149000000"
+ ];
+ [
"1735689600000000"
];
[
@@ -320,6 +653,9 @@
];
[
"1735689600000000"
+ ];
+ [
+ "32949000009"
]
]
];
@@ -335,10 +671,28 @@
"4291747200000000"
];
[
+ "4291779600000000"
+ ];
+ [
+ "4291780140000000"
+ ];
+ [
+ "4291776000000000"
+ ];
+ [
+ "4291780149000000"
+ ];
+ [
+ "4291747200000000"
+ ];
+ [
"4291401600000000"
];
[
"4291747200000000"
+ ];
+ [
+ "32949000009"
]
];
[
@@ -352,10 +706,28 @@
"4291747200000000"
];
[
+ "4291779600000000"
+ ];
+ [
+ "4291780140000000"
+ ];
+ [
+ "4291776000000000"
+ ];
+ [
+ "4291780149000000"
+ ];
+ [
+ "4291747200000000"
+ ];
+ [
"4291401600000000"
];
[
"4291747200000000"
+ ];
+ [
+ "32949000009"
]
]
];
@@ -368,6 +740,21 @@
"4611667132800000000"
];
[
+ "4611669771600000000"
+ ];
+ [
+ "4611669810300000000"
+ ];
+ [
+ "4611669811120000000"
+ ];
+ [
+ "4611669796800000000"
+ ];
+ [
+ "4611669811131000000"
+ ];
+ [
"4611661862400000000"
];
[
@@ -375,6 +762,9 @@
];
[
"4611638275200000000"
+ ];
+ [
+ "86337654321"
]
];
[
@@ -385,6 +775,21 @@
"4611667132800000000"
];
[
+ "4611669771600000000"
+ ];
+ [
+ "4611669810300000000"
+ ];
+ [
+ "4611669811120000000"
+ ];
+ [
+ "4611669796800000000"
+ ];
+ [
+ "4611669811131000000"
+ ];
+ [
"4611661862400000000"
];
[
@@ -392,6 +797,9 @@
];
[
"4611638275200000000"
+ ];
+ [
+ "86337654321"
]
]
]
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/EndOf.sql b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/EndOf.sql
index 5edefe615c..c9f01f4149 100644
--- a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/EndOf.sql
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/EndOf.sql
@@ -6,6 +6,11 @@ $check = ($arg) -> {
eomonth: DateTime::MakeTimestamp64(DateTime::EndOfMonth($arg)),
eoweek: DateTime::MakeTimestamp64(DateTime::EndOfWeek($arg)),
eoday: DateTime::MakeTimestamp64(DateTime::EndOfDay($arg)),
+ sopt13h: DateTime::MakeTimestamp64(DateTime::EndOf($arg, Interval("PT13H"))),
+ sopt4h: DateTime::MakeTimestamp64(DateTime::EndOf($arg, Interval("PT4H"))),
+ sopt15m: DateTime::MakeTimestamp64(DateTime::EndOf($arg, Interval("PT15M"))),
+ sopt20s: DateTime::MakeTimestamp64(DateTime::EndOf($arg, Interval("PT20S"))),
+ sopt7s: DateTime::MakeTimestamp64(DateTime::EndOf($arg, Interval("PT7S"))),
|>
};
diff --git a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/StartOf.sql b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/StartOf.sql
index 342eb0a19a..a87567e6fa 100644
--- a/yql/essentials/udfs/common/datetime2/test_bigdates/cases/StartOf.sql
+++ b/yql/essentials/udfs/common/datetime2/test_bigdates/cases/StartOf.sql
@@ -6,6 +6,12 @@ $check = ($arg) -> {
somonth: DateTime::MakeTimestamp64(DateTime::StartOfMonth($arg)),
soweek: DateTime::MakeTimestamp64(DateTime::StartOfWeek($arg)),
soday: DateTime::MakeTimestamp64(DateTime::StartOfDay($arg)),
+ sopt13h: DateTime::MakeTimestamp64(DateTime::StartOf($arg, Interval("PT13H"))),
+ sopt4h: DateTime::MakeTimestamp64(DateTime::StartOf($arg, Interval("PT4H"))),
+ sopt15m: DateTime::MakeTimestamp64(DateTime::StartOf($arg, Interval("PT15M"))),
+ sopt20s: DateTime::MakeTimestamp64(DateTime::StartOf($arg, Interval("PT20S"))),
+ sopt7s: DateTime::MakeTimestamp64(DateTime::StartOf($arg, Interval("PT7S"))),
+ timeofday: DateTime::TimeOfDay($arg),
|>
};