Skip to content

Commit ad04714

Browse files
authored
[backport/stable-25-1] Backport missing patches for extended dates (#19563)
2 parents 004ce66 + 996da47 commit ad04714

File tree

62 files changed

+3120
-1283
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+3120
-1283
lines changed

ydb/core/kqp/opt/physical/predicate_collector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ bool IsMemberColumn(const TExprBase& node, const TExprNode* lambdaArg) {
9898
bool IsGoodTypeForArithmeticPushdown(const TTypeAnnotationNode& type, bool allowOlapApply) {
9999
const auto features = NUdf::GetDataTypeInfo(RemoveOptionality(type).Cast<TDataExprType>()->GetSlot()).Features;
100100
return NUdf::EDataTypeFeatures::NumericType & features
101-
|| (allowOlapApply && ((NUdf::EDataTypeFeatures::BigDateType |
101+
|| (allowOlapApply && ((NUdf::EDataTypeFeatures::ExtDateType |
102102
NUdf::EDataTypeFeatures::DateType |
103103
NUdf::EDataTypeFeatures::TimeIntervalType) & features) && !(NUdf::EDataTypeFeatures::TzDateType & features));
104104
}
@@ -107,7 +107,7 @@ bool IsGoodTypeForComparsionPushdown(const TTypeAnnotationNode& type, bool allow
107107
const auto features = NUdf::GetDataTypeInfo(RemoveOptionality(type).Cast<TDataExprType>()->GetSlot()).Features;
108108
return (NUdf::EDataTypeFeatures::CanCompare & features)
109109
&& (((NUdf::EDataTypeFeatures::NumericType | NUdf::EDataTypeFeatures::StringType) & features) ||
110-
(allowOlapApply && ((NUdf::EDataTypeFeatures::BigDateType |
110+
(allowOlapApply && ((NUdf::EDataTypeFeatures::ExtDateType |
111111
NUdf::EDataTypeFeatures::DateType |
112112
NUdf::EDataTypeFeatures::TimeIntervalType) & features) && !(NUdf::EDataTypeFeatures::TzDateType & features)));
113113
}

yql/essentials/core/type_ann/type_ann_core.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,17 @@ namespace NTypeAnnImpl {
368368
.Build(), ctx.MakeType<TDataExprType>(EDataSlot::TzTimestamp) };
369369
}
370370

371+
if (resType->GetTag() == "DateTime2.TM64") {
372+
return { ctx.Builder(input->Pos())
373+
.Callable("Apply")
374+
.Callable(0, "Udf")
375+
.Atom(0, "DateTime2.MakeTzTimestamp64", TNodeFlags::Default)
376+
.Seal()
377+
.Add(1, input)
378+
.Seal()
379+
.Build(), ctx.MakeType<TDataExprType>(EDataSlot::TzTimestamp64) };
380+
}
381+
371382
if (resType->GetTag() == "JsonNode") {
372383
return { ctx.Builder(input->Pos())
373384
.Callable("Apply")

yql/essentials/core/type_ann/type_ann_list.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2400,11 +2400,13 @@ namespace {
24002400
case EDataSlot::Date:
24012401
case EDataSlot::TzDate:
24022402
case EDataSlot::Date32:
2403+
case EDataSlot::TzDate32:
24032404
value = ctx.Expr.NewAtom(input->Pos(), "86400000000", TNodeFlags::Default);
24042405
break;
24052406
case EDataSlot::Datetime:
24062407
case EDataSlot::TzDatetime:
24072408
case EDataSlot::Datetime64:
2409+
case EDataSlot::TzDatetime64:
24082410
value = ctx.Expr.NewAtom(input->Pos(), "1000000", TNodeFlags::Default);
24092411
break;
24102412
default:

yql/essentials/core/yql_expr_type_annotation.cpp

Lines changed: 73 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,75 @@ TExprNode::TPtr RebuildVariant(const TExprNode::TPtr& node,
8888
return ret;
8989
}
9090

91+
bool IsDatetimeToDatetimeCastAllowed(EDataSlot from, EDataSlot to) {
92+
if (from == EDataSlot::Date && (to == EDataSlot::TzDate ||
93+
to == EDataSlot::Date32 ||
94+
to == EDataSlot::TzDate32 ||
95+
to == EDataSlot::Datetime ||
96+
to == EDataSlot::TzDatetime ||
97+
to == EDataSlot::Datetime64 ||
98+
to == EDataSlot::TzDatetime64 ||
99+
to == EDataSlot::Timestamp ||
100+
to == EDataSlot::TzTimestamp ||
101+
to == EDataSlot::Timestamp64 ||
102+
to == EDataSlot::TzTimestamp64)
103+
) {
104+
return true;
105+
} else if (from == EDataSlot::TzDate && (to == EDataSlot::TzDate32 ||
106+
to == EDataSlot::TzDatetime ||
107+
to == EDataSlot::TzDatetime64 ||
108+
to == EDataSlot::TzTimestamp ||
109+
to == EDataSlot::TzTimestamp64)
110+
) {
111+
return true;
112+
} else if (from == EDataSlot::Date32 && (to == EDataSlot::TzDate32 ||
113+
to == EDataSlot::Datetime64 ||
114+
to == EDataSlot::TzDatetime64 ||
115+
to == EDataSlot::Timestamp64 ||
116+
to == EDataSlot::TzTimestamp64)
117+
) {
118+
return true;
119+
} else if (from == EDataSlot::TzDate32 && (to == EDataSlot::TzDatetime64 ||
120+
to == EDataSlot::TzTimestamp64)
121+
) {
122+
return true;
123+
} else if (from == EDataSlot::Datetime && (to == EDataSlot::TzDatetime ||
124+
to == EDataSlot::Datetime64 ||
125+
to == EDataSlot::TzDatetime64 ||
126+
to == EDataSlot::Timestamp ||
127+
to == EDataSlot::TzTimestamp ||
128+
to == EDataSlot::Timestamp64 ||
129+
to == EDataSlot::TzTimestamp64)
130+
) {
131+
return true;
132+
} else if (from == EDataSlot::TzDatetime && (to == EDataSlot::TzDatetime64 ||
133+
to == EDataSlot::TzTimestamp ||
134+
to == EDataSlot::TzTimestamp64)
135+
) {
136+
return true;
137+
} else if (from == EDataSlot::Datetime64 && (to == EDataSlot::TzDatetime64 ||
138+
to == EDataSlot::Timestamp64 ||
139+
to == EDataSlot::TzTimestamp64)
140+
) {
141+
return true;
142+
} else if (from == EDataSlot::TzDatetime64 && to == EDataSlot::TzTimestamp64) {
143+
return true;
144+
} else if (from == EDataSlot::Timestamp && (to == EDataSlot::TzTimestamp ||
145+
to == EDataSlot::Timestamp64 ||
146+
to == EDataSlot::TzTimestamp64)
147+
) {
148+
return true;
149+
} else if (from == EDataSlot::TzTimestamp && to == EDataSlot::TzTimestamp64) {
150+
return true;
151+
} else if (from == EDataSlot::Timestamp64 && to == EDataSlot::TzTimestamp64) {
152+
return true;
153+
} else if (from == EDataSlot::Interval && (to == EDataSlot::Interval64)) {
154+
return true;
155+
} else {
156+
return false;
157+
}
158+
}
159+
91160
IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr& node,
92161
const TTypeAnnotationNode& sourceType, const TTypeAnnotationNode& expectedType, TConvertFlags flags, bool raiseIssues = false) {
93162

@@ -332,45 +401,12 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr&
332401
if (IsDataTypeNumeric(from) && IsDataTypeNumeric(to)) {
333402
allow = GetNumericDataTypeLevel(to) >= GetNumericDataTypeLevel(from);
334403
isSafe = false;
335-
} else if (from == EDataSlot::Date && (
336-
to == EDataSlot::Date32 ||
337-
to == EDataSlot::TzDate ||
338-
to == EDataSlot::Datetime ||
339-
to == EDataSlot::Timestamp ||
340-
to == EDataSlot::TzDatetime ||
341-
to == EDataSlot::TzTimestamp ||
342-
to == EDataSlot::Datetime64 ||
343-
to == EDataSlot::Timestamp64))
344-
{
345-
allow = true;
346-
useCast = true;
347-
} else if (from == EDataSlot::Datetime && (
348-
to == EDataSlot::Datetime64 ||
349-
to == EDataSlot::TzDatetime ||
350-
to == EDataSlot::Timestamp ||
351-
to == EDataSlot::TzTimestamp ||
352-
to == EDataSlot::Timestamp64))
404+
} else if (IsDataTypeDateOrTzDateOrInterval(from) &&
405+
IsDataTypeDateOrTzDateOrInterval(to) &&
406+
IsDatetimeToDatetimeCastAllowed(from, to))
353407
{
354408
allow = true;
355409
useCast = true;
356-
} else if (from == EDataSlot::TzDate && (to == EDataSlot::TzDatetime || to == EDataSlot::TzTimestamp)) {
357-
allow = true;
358-
useCast = true;
359-
} else if (from == EDataSlot::TzDatetime && to == EDataSlot::TzTimestamp) {
360-
allow = true;
361-
useCast = true;
362-
} else if (from == EDataSlot::Timestamp && (to == EDataSlot::TzTimestamp || to == EDataSlot::Timestamp64)) {
363-
allow = true;
364-
useCast = true;
365-
} else if (from == EDataSlot::Date32 && (to == EDataSlot::Datetime64 || to == EDataSlot::Timestamp64)) {
366-
allow = true;
367-
useCast = true;
368-
} else if (from == EDataSlot::Datetime64 && (to == EDataSlot::Timestamp64)) {
369-
allow = true;
370-
useCast = true;
371-
} else if (from == EDataSlot::Interval && (to == EDataSlot::Interval64)) {
372-
allow = true;
373-
useCast = true;
374410
} else if (from == EDataSlot::Json && to == EDataSlot::Utf8) {
375411
allow = true;
376412
useCast = true;
@@ -4277,7 +4313,7 @@ bool IsDataTypeTzDate(EDataSlot dataSlot) {
42774313
}
42784314

42794315
bool IsDataTypeBigDate(EDataSlot dataSlot) {
4280-
return (NUdf::GetDataTypeInfo(dataSlot).Features & NUdf::BigDateType);
4316+
return (NUdf::GetDataTypeInfo(dataSlot).Features & NUdf::ExtDateType);
42814317
}
42824318

42834319
EDataSlot WithTzDate(EDataSlot dataSlot) {

0 commit comments

Comments
 (0)