This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 613b0bd5523 [fix](decimal) fix decimal overflow caused by null value 
(#28260)
613b0bd5523 is described below

commit 613b0bd552340635d780f7711414735d6e257c48
Author: TengJianPing <18241664+jackte...@users.noreply.github.com>
AuthorDate: Wed Dec 13 14:53:39 2023 +0800

    [fix](decimal) fix decimal overflow caused by null value (#28260)
---
 be/src/vec/columns/column_nullable.cpp             | 10 +++
 be/src/vec/columns/column_nullable.h               |  2 +
 be/src/vec/functions/function.cpp                  | 17 ++++-
 .../data/datatype_p0/decimalv3/fix-overflow.out    |  4 ++
 .../datatype_p0/decimalv3/fix-overflow.groovy      | 73 ++++++++++++++++++++++
 5 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/be/src/vec/columns/column_nullable.cpp 
b/be/src/vec/columns/column_nullable.cpp
index ecf330bead3..98ce01dd572 100644
--- a/be/src/vec/columns/column_nullable.cpp
+++ b/be/src/vec/columns/column_nullable.cpp
@@ -50,6 +50,16 @@ ColumnNullable::ColumnNullable(MutableColumnPtr&& 
nested_column_, MutableColumnP
     _need_update_has_null = true;
 }
 
+void ColumnNullable::update_null_data() {
+    const auto& null_map_data = _get_null_map_data();
+    auto s = size();
+    for (size_t i = 0; i < s; ++i) {
+        if (null_map_data[i]) {
+            nested_column->replace_column_data_default(i);
+        }
+    }
+}
+
 MutableColumnPtr ColumnNullable::get_shrinked_column() {
     return 
ColumnNullable::create(get_nested_column_ptr()->get_shrinked_column(),
                                   get_null_map_column_ptr());
diff --git a/be/src/vec/columns/column_nullable.h 
b/be/src/vec/columns/column_nullable.h
index 10b0951ab8b..8eb1f4eedb0 100644
--- a/be/src/vec/columns/column_nullable.h
+++ b/be/src/vec/columns/column_nullable.h
@@ -83,6 +83,8 @@ public:
         return Base::create(std::forward<Args>(args)...);
     }
 
+    void update_null_data();
+
     MutableColumnPtr get_shrinked_column() override;
 
     const char* get_family_name() const override { return "Nullable"; }
diff --git a/be/src/vec/functions/function.cpp 
b/be/src/vec/functions/function.cpp
index 031b8e755b4..b92f5453bfe 100644
--- a/be/src/vec/functions/function.cpp
+++ b/be/src/vec/functions/function.cpp
@@ -99,8 +99,21 @@ ColumnPtr wrap_in_nullable(const ColumnPtr& src, const 
Block& block, const Colum
         return ColumnNullable::create(src, 
ColumnUInt8::create(input_rows_count, 0));
     }
 
-    return 
ColumnNullable::create(src_not_nullable->convert_to_full_column_if_const(),
-                                  result_null_map_column);
+    bool update_null_data = false;
+    auto full_column = src_not_nullable->convert_to_full_column_if_const();
+    if (const auto* nullable = check_and_get_column<const 
ColumnNullable>(full_column.get())) {
+        const auto& nested_column = nullable->get_nested_column();
+        update_null_data = nested_column.is_numeric() || 
nested_column.is_column_decimal();
+    } else {
+        update_null_data = full_column->is_numeric() || 
full_column->is_column_decimal();
+    }
+    auto result_column = ColumnNullable::create(full_column, 
result_null_map_column);
+    if (update_null_data) {
+        auto* res_nullable_column =
+                
assert_cast<ColumnNullable*>(std::move(*result_column).mutate().get());
+        res_nullable_column->update_null_data();
+    }
+    return result_column;
 }
 
 NullPresence get_null_presence(const Block& block, const ColumnNumbers& args) {
diff --git a/regression-test/data/datatype_p0/decimalv3/fix-overflow.out 
b/regression-test/data/datatype_p0/decimalv3/fix-overflow.out
index 4bd52d46e49..ba2250c9b72 100644
--- a/regression-test/data/datatype_p0/decimalv3/fix-overflow.out
+++ b/regression-test/data/datatype_p0/decimalv3/fix-overflow.out
@@ -2,3 +2,7 @@
 -- !sql --
 1.1    \N      \N
 
+-- !select_insert --
+a      \N
+b      0.00
+
diff --git a/regression-test/suites/datatype_p0/decimalv3/fix-overflow.groovy 
b/regression-test/suites/datatype_p0/decimalv3/fix-overflow.groovy
index 7b8ef17007d..0a285189cbc 100644
--- a/regression-test/suites/datatype_p0/decimalv3/fix-overflow.groovy
+++ b/regression-test/suites/datatype_p0/decimalv3/fix-overflow.groovy
@@ -31,4 +31,77 @@ suite("fix-overflow") {
     qt_sql """
         select l.k1, r.k1, l.k1 * r.k1 from fix_overflow_l l left join 
fix_overflow_r r on l.k1=r.k1;
     """
+
+    sql """
+        drop TABLE if exists `fix_overflow_null1`;
+    """
+    sql """
+    CREATE TABLE `fix_overflow_null1`
+        (
+            `country`             varchar(20),
+            `financing_amount`    decimalv3(20, 2)
+        ) 
+        DISTRIBUTED BY HASH(`country`) BUCKETS 10
+        PROPERTIES (
+        "replication_num" = "1"
+        );
+    """
+    sql """
+        insert into fix_overflow_null1 values("a", null), ("b", 
976109703976856034.13);
+    """
+
+    sql """
+        drop TABLE if exists `fix_overflow_null2`;
+    """
+    sql """
+    CREATE TABLE `fix_overflow_null2`
+        (
+            `country`             varchar(20),
+            `financing_amount`    decimalv3(20, 2)
+        ) 
+        DISTRIBUTED BY HASH(`country`) BUCKETS 10
+        PROPERTIES (
+        "replication_num" = "1"
+        );
+    """
+
+    sql """
+    insert into fix_overflow_null2
+        select
+            *
+        from
+            (
+                with temp as (
+                    select
+                        sum(financing_amount) / 100000000 as amount,
+                        country
+                    from
+                        fix_overflow_null1
+                    group by
+                        country
+                )
+                select
+                    t1.country,
+                    IF(
+                        1 + (t1.amount - t2.amount) / ABS(t2.amount) > 0,
+                        POW(
+                            1 + (t1.amount - t2.amount) / ABS(t2.amount),
+                            1 / 5
+                        ) - 1,
+                        - POW(
+                            -(
+                                1 + (t1.amount - t2.amount) / ABS(t2.amount)
+                            ),
+                            1 / 5
+                        ) - 1
+                    ) as past_5_cagr
+                from
+                    temp t1
+                    left join temp t2 on
+                    t2.country = t1.country
+            ) as ret;
+    """
+    qt_select_insert """
+        select * from fix_overflow_null2 order by 1,2;
+    """
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to