Skip to content

Commit b6ccc63

Browse files
committed
YQL-18303: Adjust implicit cast rules between Datetime types
Follows up 16a38d1b1de0cc97c5cbf97176331ea6691e23be commit_hash:4d702692f7441dc95f2874f80f6618043b73c816 (cherry picked from commit e46659b)
1 parent 9647094 commit b6ccc63

File tree

14 files changed

+577
-59
lines changed

14 files changed

+577
-59
lines changed

yql/essentials/core/yql_expr_type_annotation.cpp

Lines changed: 72 additions & 47 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,56 +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::TzDate32 ||
339-
to == EDataSlot::Datetime ||
340-
to == EDataSlot::Timestamp ||
341-
to == EDataSlot::TzDatetime ||
342-
to == EDataSlot::TzTimestamp ||
343-
to == EDataSlot::Datetime64 ||
344-
to == EDataSlot::Timestamp64 ||
345-
to == EDataSlot::TzDatetime64 ||
346-
to == EDataSlot::TzTimestamp64))
347-
{
348-
allow = true;
349-
useCast = true;
350-
} else if (from == EDataSlot::Datetime && (
351-
to == EDataSlot::Datetime64 ||
352-
to == EDataSlot::TzDatetime ||
353-
to == EDataSlot::TzDatetime64 ||
354-
to == EDataSlot::Timestamp ||
355-
to == EDataSlot::TzTimestamp ||
356-
to == EDataSlot::Timestamp64 ||
357-
to == EDataSlot::TzTimestamp64))
404+
} else if (IsDataTypeDateOrTzDateOrInterval(from) &&
405+
IsDataTypeDateOrTzDateOrInterval(to) &&
406+
IsDatetimeToDatetimeCastAllowed(from, to))
358407
{
359408
allow = true;
360409
useCast = true;
361-
} else if (from == EDataSlot::TzDate && (to == EDataSlot::TzDatetime || to == EDataSlot::TzTimestamp)) {
362-
allow = true;
363-
useCast = true;
364-
} else if (from == EDataSlot::TzDatetime && to == EDataSlot::TzTimestamp) {
365-
allow = true;
366-
useCast = true;
367-
} else if (from == EDataSlot::Timestamp && (to == EDataSlot::TzTimestamp || to == EDataSlot::Timestamp64)) {
368-
allow = true;
369-
useCast = true;
370-
} else if (from == EDataSlot::Date32 && (to == EDataSlot::Datetime64 || to == EDataSlot::Timestamp64)) {
371-
allow = true;
372-
useCast = true;
373-
} else if (from == EDataSlot::TzDate32 && (to == EDataSlot::TzDatetime64 || to == EDataSlot::TzTimestamp64)) {
374-
allow = true;
375-
useCast = true;
376-
} else if (from == EDataSlot::Datetime64 && (to == EDataSlot::Timestamp64)) {
377-
allow = true;
378-
useCast = true;
379-
} else if (from == EDataSlot::TzDatetime64 && to == EDataSlot::TzTimestamp64) {
380-
allow = true;
381-
useCast = true;
382-
} else if (from == EDataSlot::Interval && (to == EDataSlot::Interval64)) {
383-
allow = true;
384-
useCast = true;
385410
} else if (from == EDataSlot::Json && to == EDataSlot::Utf8) {
386411
allow = true;
387412
useCast = true;

yql/essentials/public/udf/udf_data_type.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,29 @@ static const std::array<std::array<std::optional<TCastResultOptions>, DataSlotCo
4949

5050
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Uuid
5151

52-
{{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, NO, NO, NO }}, // Date
53-
{{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, NO, NO, NO }}, // Datetime
54-
{{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK, NO, NO, NO, LD, LD, OK, NO, NO, NO, NO }}, // Timestamp
52+
{{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK }}, // Date
53+
{{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK }}, // Datetime
54+
{{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK }}, // Timestamp
5555

5656
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO }}, // Interval
5757

58-
{{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK, NO, NO, NO, NO, NO, NO, NO, OK, OK, OK }}, // TzDate
59-
{{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, LD, OK, OK }}, // TzDatetime
60-
{{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK, NO, NO, NO, NO, NO, NO, NO, LD, LD, OK }}, // TzTimestamp
58+
{{ NO, MF, MF, MF, OK, OK, OK, OK, OK, OK, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK }}, // TzDate
59+
{{ NO, MF, MF, MF, MF, MF, OK, OK, OK, OK, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK }}, // TzDatetime
60+
{{ NO, MF, MF, MF, MF, MF, MF, OK, OK, LD, LD, OK, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK }}, // TzTimestamp
6161

6262
{{ NO, UN, UN, UN, UN, UN, UN, UN, UN, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, UN, NO, NO, NO, NO, NO, NO, NO, NO, NO }}, // Decimal
6363
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO }}, // DyNumber
6464
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, OK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO, NO, NO, NO, NO }}, // JsonDocument
6565

66-
{{ NO, MF, MF, MF, MF, OK, MF, OK, MF, LD, OK, OK, OK, NO, NO, NO, MF, MF, MF, NO, NO, NO, NO, NO, NO, NO, OK, OK, OK, NO, NO, NO, NO }}, // Date32
67-
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, MF, MF, NO, NO, NO, NO, NO, NO, NO, LD, OK, OK, NO, NO, NO, NO }}, // Datetime64
68-
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, FL, MF, NO, NO, NO, NO, NO, NO, NO, LD, LD, OK, NO, NO, NO, NO }}, // Timestamp64
66+
{{ NO, MF, MF, MF, MF, OK, MF, OK, MF, LD, OK, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK }}, // Date32
67+
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, MF, MF, NO, FL, MF, MF, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK }}, // Datetime64
68+
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, FL, FL, MF, NO, FL, FL, MF, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK }}, // Timestamp64
6969

7070
{{ NO, MF, MF, MF, MF, MF, MF, OK, MF, LD, LD, OK, OK, NO, NO, NO, NO, NO, NO, MF, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, NO, NO, NO }}, // Interval64
7171

72-
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, OK, OK, OK, NO, OK, OK, OK }}, // TzDate32
73-
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, LD, OK, OK, NO, LD, OK, OK }}, // TzDatetime64
74-
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, MF, MF, MF, NO, MF, MF, MF, NO, NO, NO, LD, LD, OK, NO, LD, LD, OK }}, // TzTimestamp64
72+
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, MF, MF, MF, NO, NO, NO, LD, LD, LD, NO, OK, OK, OK }}, // TzDate32
73+
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, MF, MF, NO, NO, NO, LD, LD, LD, NO, LD, OK, OK }}, // TzDatetime64
74+
{{ NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, OK, OK, NO, NO, NO, FL, FL, FL, NO, FL, FL, MF, NO, NO, NO, LD, LD, LD, NO, LD, LD, OK }}, // TzTimestamp64
7575
}};
7676

7777
}

yql/essentials/tests/sql/minirun/part1/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,20 @@
181181
"uri": "https://{canondata_backend}/1920236/fd3dfd41a8e63d7fa9cb2e8c3d8e6d8d5f51f2cb/resource.tar.gz#test.test_bigdate-common_type-default.txt-Results_/results.txt"
182182
}
183183
],
184+
"test.test[bigdate-date_implicit_casts-default.txt-Debug]": [
185+
{
186+
"checksum": "789f10569635819d64aa27c444319745",
187+
"size": 2504,
188+
"uri": "https://{canondata_backend}/1784117/f78d2455106ce42ce9bf47234459b8ee215bd2a8/resource.tar.gz#test.test_bigdate-date_implicit_casts-default.txt-Debug_/opt.yql"
189+
}
190+
],
191+
"test.test[bigdate-date_implicit_casts-default.txt-Results]": [
192+
{
193+
"checksum": "ccd1abdc388d2fb9efc4ad32e92e494b",
194+
"size": 8256,
195+
"uri": "https://{canondata_backend}/1881367/3d3cb0f3b636c2874422b42dbe0654ce256c590a/resource.tar.gz#test.test_bigdate-date_implicit_casts-default.txt-Results_/results.txt"
196+
}
197+
],
184198
"test.test[bigdate-int_literals-default.txt-Debug]": [
185199
{
186200
"checksum": "7e213ec4e7df7188baa32a632462cf2c",

yql/essentials/tests/sql/minirun/part3/canondata/result.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,20 @@
195195
"uri": "https://{canondata_backend}/1881367/948e93b5cacfa4a732bc9d920d6546ab3f25aba9/resource.tar.gz#test.test_bigdate-const_interval64-default.txt-Results_/results.txt"
196196
}
197197
],
198+
"test.test[bigdate-date_tz_implicit_casts-default.txt-Debug]": [
199+
{
200+
"checksum": "af8f65aa083f5cde0a4bb4f078e10bc9",
201+
"size": 1306,
202+
"uri": "https://{canondata_backend}/1936947/d9fc1c1289e163d90287579127b30a378edfb34d/resource.tar.gz#test.test_bigdate-date_tz_implicit_casts-default.txt-Debug_/opt.yql"
203+
}
204+
],
205+
"test.test[bigdate-date_tz_implicit_casts-default.txt-Results]": [
206+
{
207+
"checksum": "619f9a0210499a1f34d5209cd7d1d77a",
208+
"size": 3137,
209+
"uri": "https://{canondata_backend}/1942278/584acca05dd7d7e8eec1b57cf050b7123a65c1ca/resource.tar.gz#test.test_bigdate-date_tz_implicit_casts-default.txt-Results_/results.txt"
210+
}
211+
],
198212
"test.test[bigdate-output_interval64-default.txt-Debug]": [
199213
{
200214
"checksum": "298089b9382a0a77c9e268c9f0e95b3a",
@@ -418,6 +432,20 @@
418432
"uri": "https://{canondata_backend}/1946324/15d61515f724d2d343da00780ff2c6ac72278fb3/resource.tar.gz#test.test_datetime-date_diff_sub-default.txt-Results_/results.txt"
419433
}
420434
],
435+
"test.test[datetime-date_tz_implicit_casts-default.txt-Debug]": [
436+
{
437+
"checksum": "a12a2924c35fe2b445a4dcd5754c3a3e",
438+
"size": 2810,
439+
"uri": "https://{canondata_backend}/1936947/d9fc1c1289e163d90287579127b30a378edfb34d/resource.tar.gz#test.test_datetime-date_tz_implicit_casts-default.txt-Debug_/opt.yql"
440+
}
441+
],
442+
"test.test[datetime-date_tz_implicit_casts-default.txt-Results]": [
443+
{
444+
"checksum": "69877e6b31258394712a217a32aa3104",
445+
"size": 9381,
446+
"uri": "https://{canondata_backend}/1942278/584acca05dd7d7e8eec1b57cf050b7123a65c1ca/resource.tar.gz#test.test_datetime-date_tz_implicit_casts-default.txt-Results_/results.txt"
447+
}
448+
],
421449
"test.test[expr-between-default.txt-Debug]": [
422450
{
423451
"checksum": "c82b19a5180d2a2ed8230c2cf45ab2cc",

yql/essentials/tests/sql/minirun/part7/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,20 @@
300300
"uri": "https://{canondata_backend}/1942525/7665133ac15a3f92aef975c99a4dfe3023179a69/resource.tar.gz#test.test_compute_range-huge_in-default.txt-Results_/results.txt"
301301
}
302302
],
303+
"test.test[datetime-date_implicit_casts-default.txt-Debug]": [
304+
{
305+
"checksum": "2cdfd9b9555629a03ccbe417b073bd0d",
306+
"size": 5074,
307+
"uri": "https://{canondata_backend}/1784117/d599636e2d967126fd75f502ca3a5d02b64bf51b/resource.tar.gz#test.test_datetime-date_implicit_casts-default.txt-Debug_/opt.yql"
308+
}
309+
],
310+
"test.test[datetime-date_implicit_casts-default.txt-Results]": [
311+
{
312+
"checksum": "43ef32eed9cca4f5bbae8c64716bd496",
313+
"size": 19531,
314+
"uri": "https://{canondata_backend}/1942278/99edd2df721ae9dc3716d646ed769087f6a44079/resource.tar.gz#test.test_datetime-date_implicit_casts-default.txt-Results_/results.txt"
315+
}
316+
],
303317
"test.test[datetime-date_out-default.txt-Debug]": [
304318
{
305319
"checksum": "6e830b11f1faaaa8fba8fca98ab9337c",

0 commit comments

Comments
 (0)