This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 71872cd37e8 [branch-2.0][improvement](serde) Handle NaN values in
number for MySQL result write (#33230)
71872cd37e8 is described below
commit 71872cd37e84349c4c7bfb2380b882817f9a86be
Author: zy-kkk <[email protected]>
AuthorDate: Thu Apr 4 08:15:57 2024 +0800
[branch-2.0][improvement](serde) Handle NaN values in number for MySQL
result write (#33230)
pick #33227
---
.../data_types/serde/data_type_number_serde.cpp | 14 +++++++++--
.../data/datatype_p0/double/test_double_nan.out | 7 ++++++
.../data/datatype_p0/float/test_float_nan.out | 7 ++++++
.../data/nereids_function_p0/scalar_function/A.out | 16 ++++++-------
.../datatype_p0/double/test_double_nan.groovy | 28 ++++++++++++++++++++++
.../suites/datatype_p0/float/test_float_nan.groovy | 28 ++++++++++++++++++++++
6 files changed, 90 insertions(+), 10 deletions(-)
diff --git a/be/src/vec/data_types/serde/data_type_number_serde.cpp
b/be/src/vec/data_types/serde/data_type_number_serde.cpp
index af885dc8cc5..10a4c7b0105 100644
--- a/be/src/vec/data_types/serde/data_type_number_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_number_serde.cpp
@@ -212,9 +212,19 @@ Status
DataTypeNumberSerDe<T>::_write_column_to_mysql(const IColumn& column,
} else if constexpr (std::is_same_v<T, Int128>) {
buf_ret = result.push_largeint(data[col_index]);
} else if constexpr (std::is_same_v<T, float>) {
- buf_ret = result.push_float(data[col_index]);
+ if (std::isnan(data[col_index])) {
+ // Handle NaN for float, we should push null value
+ buf_ret = result.push_null();
+ } else {
+ buf_ret = result.push_float(data[col_index]);
+ }
} else if constexpr (std::is_same_v<T, double>) {
- buf_ret = result.push_double(data[col_index]);
+ if (std::isnan(data[col_index])) {
+ // Handle NaN for double, we should push null value
+ buf_ret = result.push_null();
+ } else {
+ buf_ret = result.push_double(data[col_index]);
+ }
}
if (UNLIKELY(buf_ret != 0)) {
return Status::InternalError("pack mysql buffer failed.");
diff --git a/regression-test/data/datatype_p0/double/test_double_nan.out
b/regression-test/data/datatype_p0/double/test_double_nan.out
new file mode 100644
index 00000000000..327a147e2db
--- /dev/null
+++ b/regression-test/data/datatype_p0/double/test_double_nan.out
@@ -0,0 +1,7 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select --
+1 \N
+
+-- !select --
+\N
+
diff --git a/regression-test/data/datatype_p0/float/test_float_nan.out
b/regression-test/data/datatype_p0/float/test_float_nan.out
new file mode 100644
index 00000000000..327a147e2db
--- /dev/null
+++ b/regression-test/data/datatype_p0/float/test_float_nan.out
@@ -0,0 +1,7 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !select --
+1 \N
+
+-- !select --
+\N
+
diff --git a/regression-test/data/nereids_function_p0/scalar_function/A.out
b/regression-test/data/nereids_function_p0/scalar_function/A.out
index 13d9bcccb6e..24dac44e3e5 100644
--- a/regression-test/data/nereids_function_p0/scalar_function/A.out
+++ b/regression-test/data/nereids_function_p0/scalar_function/A.out
@@ -243,8 +243,8 @@
0.6435011087932843
0.45102681179626236
0.0
-nan
-nan
+\N
+\N
-- !sql_acos_Double_notnull --
1.4706289056333368
@@ -257,8 +257,8 @@ nan
0.6435011087932843
0.45102681179626236
0.0
-nan
-nan
+\N
+\N
-- !sql_append_trailing_char_if_absent_Varchar_Varchar --
\N
@@ -388,8 +388,8 @@ nan
0.9272952180016123
1.1197695149986342
1.5707963267948966
-nan
-nan
+\N
+\N
-- !sql_asin_Double_notnull --
0.1001674211615598
@@ -402,8 +402,8 @@ nan
0.9272952180016123
1.1197695149986342
1.5707963267948966
-nan
-nan
+\N
+\N
-- !sql_atan_Double --
\N
diff --git a/regression-test/suites/datatype_p0/double/test_double_nan.groovy
b/regression-test/suites/datatype_p0/double/test_double_nan.groovy
new file mode 100644
index 00000000000..b193b0132db
--- /dev/null
+++ b/regression-test/suites/datatype_p0/double/test_double_nan.groovy
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_double_nan", "datatype_p0") {
+ def tableName = "tbl_test_double_nan"
+ sql "DROP TABLE IF EXISTS ${tableName}"
+ sql "CREATE TABLE if NOT EXISTS ${tableName} (k int, value double)
DUPLICATE KEY(k) DISTRIBUTED BY HASH (k) BUCKETS 1 PROPERTIES
('replication_num' = '1');"
+ sql """insert into ${tableName} select 1, sqrt(-1);"""
+
+ qt_select "select * from ${tableName} order by 1;"
+ qt_select "select sqrt(-1);"
+
+ sql "DROP TABLE IF EXISTS ${tableName}"
+}
\ No newline at end of file
diff --git a/regression-test/suites/datatype_p0/float/test_float_nan.groovy
b/regression-test/suites/datatype_p0/float/test_float_nan.groovy
new file mode 100644
index 00000000000..18958b27cf2
--- /dev/null
+++ b/regression-test/suites/datatype_p0/float/test_float_nan.groovy
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_float_nan", "datatype_p0") {
+ def tableName = "tbl_test_float_nan"
+ sql "DROP TABLE IF EXISTS ${tableName}"
+ sql "CREATE TABLE if NOT EXISTS ${tableName} (k int, value float)
DUPLICATE KEY(k) DISTRIBUTED BY HASH (k) BUCKETS 1 PROPERTIES
('replication_num' = '1');"
+ sql """insert into ${tableName} select 1, sqrt(-1);"""
+
+ qt_select "select * from ${tableName} order by 1;"
+ qt_select "select sqrt(-1);"
+
+ sql "DROP TABLE IF EXISTS ${tableName}"
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]