From d712748304f4201e1fa0d6258e23d927796bedcd Mon Sep 17 00:00:00 2001 From: Maksim Kita Date: Fri, 22 Jan 2021 16:24:51 +0300 Subject: [PATCH] Function accurateCastOrNull fixed unitialized values for numeric cast --- src/Functions/FunctionsConversion.h | 8 ++++++++ tests/performance/casts.xml | 15 +++++++++++++++ .../01556_accurate_cast_or_null.reference | 2 ++ .../0_stateless/01556_accurate_cast_or_null.sql | 2 ++ 4 files changed, 27 insertions(+) create mode 100644 tests/performance/casts.xml diff --git a/src/Functions/FunctionsConversion.h b/src/Functions/FunctionsConversion.h index 978fa0a79d8..0e162fc2469 100644 --- a/src/Functions/FunctionsConversion.h +++ b/src/Functions/FunctionsConversion.h @@ -188,7 +188,10 @@ struct ConvertImpl (std::is_same_v || std::is_same_v)) { if constexpr (std::is_same_v) + { + vec_to[i] = 0; (*vec_null_map_to)[i] = true; + } else throw Exception("Unexpected UInt128 to big int conversion", ErrorCodes::NOT_IMPLEMENTED); } @@ -215,7 +218,10 @@ struct ConvertImpl if (convert_result) vec_to[i] = result; else + { + vec_to[i] = static_cast(0); (*vec_null_map_to)[i] = true; + } } else { @@ -238,6 +244,7 @@ struct ConvertImpl { if constexpr (std::is_same_v) { + vec_to[i] = 0; (*vec_null_map_to)[i] = true; continue; } @@ -255,6 +262,7 @@ struct ConvertImpl { if (std::is_same_v) { + vec_to[i] = 0; (*vec_null_map_to)[i] = true; } else diff --git a/tests/performance/casts.xml b/tests/performance/casts.xml new file mode 100644 index 00000000000..17a1c774353 --- /dev/null +++ b/tests/performance/casts.xml @@ -0,0 +1,15 @@ + + + 15G + + + CREATE TABLE t (x UInt64) ENGINE = Memory + + INSERT INTO t SELECT number AS x FROM numbers_mt(200000000) SETTINGS max_threads = 8 + DROP TABLE IF EXISTS t + + SELECT cast(x, 'Int64'), cast(x, 'Int128'), cast(x, 'Int256'), cast(x, 'String'), cast(x, 'Decimal64(8)') FROM t FORMAT Null + SELECT accurateCast(x, 'Int64'), accurateCast(x, 'Int128'), accurateCast(x, 'Int256'), accurateCast(x, 'String'), accurateCast(x, 'Decimal64(8)') FROM t FORMAT Null + SELECT accurateCastOrNull(x, 'Int64'), accurateCastOrNull(x, 'Int128'), accurateCastOrNull(x, 'Int256'), accurateCastOrNull(x, 'String'), accurateCastOrNull(x, 'Decimal64(8)') FROM t FORMAT Null + + diff --git a/tests/queries/0_stateless/01556_accurate_cast_or_null.reference b/tests/queries/0_stateless/01556_accurate_cast_or_null.reference index 4287c755c3f..3b27dd2e2e1 100644 --- a/tests/queries/0_stateless/01556_accurate_cast_or_null.reference +++ b/tests/queries/0_stateless/01556_accurate_cast_or_null.reference @@ -28,3 +28,5 @@ \N \N \N +127 +\N diff --git a/tests/queries/0_stateless/01556_accurate_cast_or_null.sql b/tests/queries/0_stateless/01556_accurate_cast_or_null.sql index b11ed5939fa..b45bbe35662 100644 --- a/tests/queries/0_stateless/01556_accurate_cast_or_null.sql +++ b/tests/queries/0_stateless/01556_accurate_cast_or_null.sql @@ -33,3 +33,5 @@ SELECT accurateCastOrNull(inf, 'UInt64'); SELECT accurateCastOrNull(inf, 'UInt256'); SELECT accurateCastOrNull(nan, 'UInt64'); SELECT accurateCastOrNull(nan, 'UInt256'); + +SELECT accurateCastOrNull(number + 127, 'Int8') AS x FROM numbers (2) ORDER BY x;