aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2023-10-24 01:52:20 +0300
committeraneporada <aneporada@ydb.tech>2023-10-24 02:14:14 +0300
commit9650bcb5320e7726327a1378c2420d855364e506 (patch)
tree4c6682bcdfaedb9f83b3c929d3ba6b1927444aa7
parent39357888f3f58ba16af3b31c8386cb1dd46b0c7b (diff)
downloadydb-9650bcb5320e7726327a1378c2420d855364e506.tar.gz
Fix implicit casts between string-like types
-rw-r--r--ydb/library/yql/core/yql_expr_type_annotation.cpp16
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/sql2yql/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/suites/expr/cast_string_implicit.sql16
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json21
5 files changed, 89 insertions, 0 deletions
diff --git a/ydb/library/yql/core/yql_expr_type_annotation.cpp b/ydb/library/yql/core/yql_expr_type_annotation.cpp
index b51debf769e..f45ca76a04a 100644
--- a/ydb/library/yql/core/yql_expr_type_annotation.cpp
+++ b/ydb/library/yql/core/yql_expr_type_annotation.cpp
@@ -323,6 +323,17 @@ IGraphTransformer::TStatus TryConvertToImpl(TExprContext& ctx, TExprNode::TPtr&
} else if (from == EDataSlot::Timestamp && to == EDataSlot::TzTimestamp) {
allow = true;
useCast = true;
+ } else if (from == EDataSlot::Json && to == EDataSlot::Utf8) {
+ allow = true;
+ useCast = true;
+ } else if ((from == EDataSlot::Yson || from == EDataSlot::Json) && to == EDataSlot::String) {
+ node = ctx.Builder(node->Pos())
+ .Callable("ToBytes")
+ .Add(0, node)
+ .Seal()
+ .Build();
+
+ return IGraphTransformer::TStatus::Repeat;
} else if (IsDataTypeIntegral(from) && to == EDataSlot::Timestamp) {
node = ctx.Builder(node->Pos())
.Callable("UnsafeTimestampCast")
@@ -4164,6 +4175,11 @@ TMaybe<EDataSlot> GetSuperType(EDataSlot dataSlot1, EDataSlot dataSlot2) {
}
if (IsDataTypeString(dataSlot1) && IsDataTypeString(dataSlot2)) {
+ if (dataSlot1 == EDataSlot::Json && dataSlot2 == EDataSlot::Utf8 ||
+ dataSlot1 == EDataSlot::Utf8 && dataSlot2 == EDataSlot::Json)
+ {
+ return EDataSlot::Utf8;
+ }
return EDataSlot::String;
}
diff --git a/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json
index 34b2f2c20f2..3989b75b9da 100644
--- a/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part1/canondata/result.json
@@ -1557,6 +1557,28 @@
"uri": "file://test.test_epochs-reset_sortness_on_append--Results_/extracted"
}
],
+ "test.test[expr-cast_string_implicit-default.txt-Analyze]": [
+ {
+ "checksum": "8ddfa95f10135fbea51411372a704ae9",
+ "size": 5055,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/31125da8bc31fe5a5232f3a169fa8a2431a89df9/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Analyze_/plan.txt"
+ }
+ ],
+ "test.test[expr-cast_string_implicit-default.txt-Debug]": [
+ {
+ "checksum": "009b7ed762d7b9a933b17555fd96ea0a",
+ "size": 1643,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/31125da8bc31fe5a5232f3a169fa8a2431a89df9/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[expr-cast_string_implicit-default.txt-Plan]": [
+ {
+ "checksum": "8ddfa95f10135fbea51411372a704ae9",
+ "size": 5055,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/31125da8bc31fe5a5232f3a169fa8a2431a89df9/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[expr-cast_string_implicit-default.txt-Results]": [],
"test.test[expr-double_join_with_list_from_range--Analyze]": [
{
"checksum": "ec0138ca15e0c90fbc82b5151782eb47",
diff --git a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
index 61ea00c5ac4..480f9a815be 100644
--- a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
+++ b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
@@ -4815,6 +4815,13 @@
"uri": "https://storage.yandex-team.ru/get-devtools/1936997/00f46808be87e2ae2d4ac3ac45675b659c5ace45/resource.tar.gz#test_sql2yql.test_expr-cast_reverse_list_/sql.yql"
}
],
+ "test_sql2yql.test[expr-cast_string_implicit]": [
+ {
+ "checksum": "ebc0c6ee713f907fa1b53c21782b4ab7",
+ "size": 9546,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937429/fc2e2272b44dc3151e48b91e7cd8bb9987c40aa0/resource.tar.gz#test_sql2yql.test_expr-cast_string_implicit_/sql.yql"
+ }
+ ],
"test_sql2yql.test[expr-cast_struct]": [
{
"checksum": "8d61a81c296392b2dcb58bb57467ce7c",
@@ -21713,6 +21720,13 @@
"uri": "https://storage.yandex-team.ru/get-devtools/1599023/4bd7e6892a9762eec433e60bda88f20cddadc74c/resource.tar.gz#test_sql_format.test_expr-cast_reverse_list_/formatted.sql"
}
],
+ "test_sql_format.test[expr-cast_string_implicit]": [
+ {
+ "checksum": "d478730e186113dd13d5a8885ff79f0a",
+ "size": 688,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937429/fc2e2272b44dc3151e48b91e7cd8bb9987c40aa0/resource.tar.gz#test_sql_format.test_expr-cast_string_implicit_/formatted.sql"
+ }
+ ],
"test_sql_format.test[expr-cast_struct]": [
{
"checksum": "3f19779de786087855a1acb3e741f2b7",
diff --git a/ydb/library/yql/tests/sql/suites/expr/cast_string_implicit.sql b/ydb/library/yql/tests/sql/suites/expr/cast_string_implicit.sql
new file mode 100644
index 00000000000..b2872be2a1d
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/expr/cast_string_implicit.sql
@@ -0,0 +1,16 @@
+select AsList('aaa', 'aaa'u); -- List<String>
+select AsList('aaa', '[1, 2, 3]'j); -- List<String>
+select AsList('aaa', '[1; 2; 3]'y); -- List<String>
+
+select AsList('aaa'u, 'aaa'); -- List<String>
+select AsList('aaa'u, '[1, 2, 3]'j); -- List<Utf8>
+select AsList('aaa'u, '[1; 2; 3]'y); -- List<String>
+
+select AsList('[1, 2, 3]'j, 'aaa'); -- List<String>
+select AsList('[1, 2, 3]'j, 'aaa'u); -- List<Utf8>
+select AsList('[1, 2, 3]'j, '[1; 2; 3]'y); -- List<String>
+
+select AsList('[1; 2; 3]'y, 'aaa'); -- List<String>
+select AsList('[1; 2; 3]'y, 'aaa'u); -- List<String>
+select AsList('[1; 2; 3]'y, '[1, 2, 3]'j); -- List<String>
+
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json
index 9c30abc4ad0..7bda668ae22 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part1/canondata/result.json
@@ -1486,6 +1486,27 @@
"uri": "file://test.test_epochs-reset_sortness_on_append--Results_/extracted"
}
],
+ "test.test[expr-cast_string_implicit-default.txt-Debug]": [
+ {
+ "checksum": "47ce9b44cc3866c646c585b765b20521",
+ "size": 1573,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/b2f07850d2b08ff437b030045e856abfff71f416/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Debug_/opt.yql"
+ }
+ ],
+ "test.test[expr-cast_string_implicit-default.txt-Plan]": [
+ {
+ "checksum": "8ddfa95f10135fbea51411372a704ae9",
+ "size": 5055,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/b2f07850d2b08ff437b030045e856abfff71f416/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Plan_/plan.txt"
+ }
+ ],
+ "test.test[expr-cast_string_implicit-default.txt-Results]": [
+ {
+ "checksum": "60eaa095793601463ebfaf5c4e24d890",
+ "size": 10738,
+ "uri": "https://storage.yandex-team.ru/get-devtools/1937027/b2f07850d2b08ff437b030045e856abfff71f416/resource.tar.gz#test.test_expr-cast_string_implicit-default.txt-Results_/results.txt"
+ }
+ ],
"test.test[expr-double_join_with_list_from_range--Debug]": [
{
"checksum": "ce7a234d0602157c588e83eaa4b9f22a",