Skip to content

Commit cc73f2c

Browse files
authored
Literals for big tz types (#5739)
1 parent b6b4444 commit cc73f2c

File tree

18 files changed

+565
-119
lines changed

18 files changed

+565
-119
lines changed

ydb/library/yql/core/sql_types/simple_types.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ std::optional<std::string_view> LookupSimpleTypeBySqlAlias(const std::string_vie
6363
{"datetime64", "Datetime64"},
6464
{"timestamp64", "Timestamp64"},
6565
{"interval64", "Interval64"},
66+
{"tzdate32", "TzDate32"},
67+
{"tzdatetime64", "TzDatetime64"},
68+
{"tztimestamp64", "TzTimestamp64"},
6669
};
6770

6871
// new types (or aliases) should be added here

ydb/library/yql/core/type_ann/type_ann_core.cpp

+39-4
Original file line numberDiff line numberDiff line change
@@ -117,28 +117,51 @@ namespace NTypeAnnImpl {
117117
bool isValid;
118118
if (atomNode.Flags() & TNodeFlags::BinaryContent) {
119119
// just deserialize
120-
switch (sizeof(T)) {
121-
case sizeof(ui16): {
120+
switch (slot) {
121+
case NKikimr::NUdf::EDataSlot::Date: {
122122
ui16 value;
123123
ui16 tzId;
124124
isValid = NKikimr::NMiniKQL::DeserializeTzDate(atomNode.Content(), value, tzId);
125125
plainValue = SerializeTzComponents(isValid, value, tzId);
126126
break;
127127
}
128-
case sizeof(ui32): {
128+
case NKikimr::NUdf::EDataSlot::Datetime: {
129129
ui32 value;
130130
ui16 tzId;
131131
isValid = NKikimr::NMiniKQL::DeserializeTzDatetime(atomNode.Content(), value, tzId);
132132
plainValue = SerializeTzComponents(isValid, value, tzId);
133133
break;
134134
}
135-
case sizeof(ui64): {
135+
case NKikimr::NUdf::EDataSlot::Timestamp: {
136136
ui64 value;
137137
ui16 tzId;
138138
isValid = NKikimr::NMiniKQL::DeserializeTzTimestamp(atomNode.Content(), value, tzId);
139139
plainValue = SerializeTzComponents(isValid, value, tzId);
140140
break;
141141
}
142+
case NKikimr::NUdf::EDataSlot::Date32: {
143+
i32 value;
144+
ui16 tzId;
145+
isValid = NKikimr::NMiniKQL::DeserializeTzDate32(atomNode.Content(), value, tzId);
146+
plainValue = SerializeTzComponents(isValid, value, tzId);
147+
break;
148+
}
149+
case NKikimr::NUdf::EDataSlot::Datetime64: {
150+
i64 value;
151+
ui16 tzId;
152+
isValid = NKikimr::NMiniKQL::DeserializeTzDatetime64(atomNode.Content(), value, tzId);
153+
plainValue = SerializeTzComponents(isValid, value, tzId);
154+
break;
155+
}
156+
case NKikimr::NUdf::EDataSlot::Timestamp64: {
157+
i64 value;
158+
ui16 tzId;
159+
isValid = NKikimr::NMiniKQL::DeserializeTzTimestamp64(atomNode.Content(), value, tzId);
160+
plainValue = SerializeTzComponents(isValid, value, tzId);
161+
break;
162+
}
163+
default:
164+
Y_ENSURE(false, "Unknown data slot:" << slot);
142165
}
143166
} else {
144167
TStringBuf atom = atomNode.Content();
@@ -742,6 +765,18 @@ namespace NTypeAnnImpl {
742765
if (!IsValidSmallData<i64>(input->Head(), input->Content(), ctx.Expr, NKikimr::NUdf::EDataSlot::Interval64, textValue)) {
743766
return IGraphTransformer::TStatus::Error;
744767
}
768+
} else if (input->Content() == "TzDate32") {
769+
if (!IsValidTzData<i32>(input->Head(), input->Content(), ctx.Expr, NKikimr::NUdf::EDataSlot::Date32, textValue)) {
770+
return IGraphTransformer::TStatus::Error;
771+
}
772+
} else if (input->Content() == "TzDatetime64") {
773+
if (!IsValidTzData<i64>(input->Head(), input->Content(), ctx.Expr, NKikimr::NUdf::EDataSlot::Datetime64, textValue)) {
774+
return IGraphTransformer::TStatus::Error;
775+
}
776+
} else if (input->Content() == "TzTimestamp64") {
777+
if (!IsValidTzData<i64>(input->Head(), input->Content(), ctx.Expr, NKikimr::NUdf::EDataSlot::Timestamp64, textValue)) {
778+
return IGraphTransformer::TStatus::Error;
779+
}
745780
} else if (input->Content() == "Uuid") {
746781
if (input->Head().Content().size() != 16) {
747782
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Bad atom format for type: "

ydb/library/yql/minikql/mkql_node_serialization.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,21 @@ namespace {
772772
case NUdf::TDataType<NUdf::TInterval64>::Id:
773773
Owner.WriteVar64(ZigZagEncode(value.Get<NUdf::TDataType<NUdf::TInterval64>::TLayout>()));
774774
break;
775+
case NUdf::TDataType<NUdf::TTzDate32>::Id: {
776+
Owner.WriteVar32(ZigZagEncode(value.Get<NUdf::TDataType<NUdf::TTzDate32>::TLayout>()));
777+
Owner.WriteVar32(value.GetTimezoneId());
778+
break;
779+
}
780+
case NUdf::TDataType<NUdf::TTzDatetime64>::Id: {
781+
Owner.WriteVar64(ZigZagEncode(value.Get<NUdf::TDataType<NUdf::TTzDatetime64>::TLayout>()));
782+
Owner.WriteVar32(value.GetTimezoneId());
783+
break;
784+
}
785+
case NUdf::TDataType<NUdf::TTzTimestamp64>::Id: {
786+
Owner.WriteVar64(ZigZagEncode(value.Get<NUdf::TDataType<NUdf::TTzTimestamp64>::TLayout>()));
787+
Owner.WriteVar32(value.GetTimezoneId());
788+
break;
789+
}
775790
case NUdf::TDataType<NUdf::TUuid>::Id: {
776791
const auto v = value.AsStringRef();
777792
Owner.WriteMany(v.Data(), v.Size());
@@ -1750,6 +1765,30 @@ namespace {
17501765
value = NUdf::TUnboxedValuePod(static_cast<NUdf::TDataType<NUdf::TInterval64>::TLayout>(ZigZagDecode(ReadVar64())));
17511766
break;
17521767
}
1768+
case NUdf::TDataType<NUdf::TTzDate32>::Id:
1769+
{
1770+
value = NUdf::TUnboxedValuePod(static_cast<NUdf::TDataType<NUdf::TTzDate32>::TLayout>(ZigZagDecode(ReadVar32())));
1771+
const ui32 tzId = ReadVar32();
1772+
MKQL_ENSURE(tzId <= Max<ui16>() && IsValidTimezoneId((ui16)tzId), "Unknown timezone: " << tzId);
1773+
value.SetTimezoneId((ui16)tzId);
1774+
break;
1775+
}
1776+
case NUdf::TDataType<NUdf::TTzDatetime64>::Id:
1777+
{
1778+
value = NUdf::TUnboxedValuePod(static_cast<NUdf::TDataType<NUdf::TTzDatetime64>::TLayout>(ZigZagDecode(ReadVar64())));
1779+
const ui32 tzId = ReadVar32();
1780+
MKQL_ENSURE(tzId <= Max<ui16>() && IsValidTimezoneId((ui16)tzId), "Unknown timezone: " << tzId);
1781+
value.SetTimezoneId((ui16)tzId);
1782+
break;
1783+
}
1784+
case NUdf::TDataType<NUdf::TTzTimestamp64>::Id:
1785+
{
1786+
value = NUdf::TUnboxedValuePod(static_cast<NUdf::TDataType<NUdf::TTzTimestamp64>::TLayout>(ZigZagDecode(ReadVar64())));
1787+
const ui32 tzId = ReadVar32();
1788+
MKQL_ENSURE(tzId <= Max<ui16>() && IsValidTimezoneId((ui16)tzId), "Unknown timezone: " << tzId);
1789+
value.SetTimezoneId((ui16)tzId);
1790+
break;
1791+
}
17531792
case NUdf::TDataType<NUdf::TUuid>::Id:
17541793
{
17551794
const char* buffer = ReadMany(16);

0 commit comments

Comments
 (0)