diff options
author | aneporada <aneporada@ydb.tech> | 2023-10-24 01:52:20 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-10-24 02:14:14 +0300 |
commit | 9650bcb5320e7726327a1378c2420d855364e506 (patch) | |
tree | 4c6682bcdfaedb9f83b3c929d3ba6b1927444aa7 | |
parent | 39357888f3f58ba16af3b31c8386cb1dd46b0c7b (diff) | |
download | ydb-9650bcb5320e7726327a1378c2420d855364e506.tar.gz |
Fix implicit casts between string-like types
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", |