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

panxiaolei 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 10f0c638969 [FIX](complex-type) fix agg table with complex type with 
replace state (#24873)
10f0c638969 is described below

commit 10f0c6389693bb965aba60c333fee96997a6ee49
Author: amory <[email protected]>
AuthorDate: Tue Oct 3 16:32:58 2023 +0800

    [FIX](complex-type) fix agg table with complex type with replace state 
(#24873)
    
    fix agg table with complex type with replace state
---
 be/src/vec/columns/column_array.h                  | 20 +++++++++++++++++---
 be/src/vec/columns/column_map.h                    | 21 ++++++++++++++++++---
 be/src/vec/columns/column_struct.h                 | 16 +++++++++++++---
 be/src/vec/olap/block_reader.cpp                   | 22 ++++++++++++++++------
 be/src/vec/olap/block_reader.h                     |  2 +-
 ...est_nested_types_insert_into_with_agg_table.out | 15 +++++++++++++++
 ..._nested_types_insert_into_with_agg_table.groovy |  5 +++++
 7 files changed, 85 insertions(+), 16 deletions(-)

diff --git a/be/src/vec/columns/column_array.h 
b/be/src/vec/columns/column_array.h
index b42800d5b26..bf89d74ba5d 100644
--- a/be/src/vec/columns/column_array.h
+++ b/be/src/vec/columns/column_array.h
@@ -227,12 +227,26 @@ public:
     void insert_indices_from(const IColumn& src, const int* indices_begin,
                              const int* indices_end) override;
 
-    void replace_column_data(const IColumn&, size_t row, size_t self_row = 0) 
override {
-        LOG(FATAL) << "replace_column_data not implemented";
+    void replace_column_data(const IColumn& rhs, size_t row, size_t self_row = 
0) override {
+        DCHECK(size() > self_row);
+        const auto& r = assert_cast<const ColumnArray&>(rhs);
+        const size_t nested_row_size = r.size_at(row);
+        const size_t r_nested_start_off = r.offset_at(row);
+
+        // we should clear data because we call resize() before 
replace_column_data()
+        if (self_row == 0) {
+            data->clear();
+        }
+        get_offsets()[self_row] = get_offsets()[self_row - 1] + 
nested_row_size;
+        // we make sure call replace_column_data() by order so, here we just 
insert data for nested
+        data->insert_range_from(r.get_data(), r_nested_start_off, 
nested_row_size);
     }
+
     void replace_column_data_default(size_t self_row = 0) override {
-        LOG(FATAL) << "replace_column_data_default not implemented";
+        DCHECK(size() > self_row);
+        get_offsets()[self_row] = get_offsets()[self_row - 1];
     }
+
     void clear() override {
         data->clear();
         offsets->clear();
diff --git a/be/src/vec/columns/column_map.h b/be/src/vec/columns/column_map.h
index 9d4f1f92702..5dc1c22aefc 100644
--- a/be/src/vec/columns/column_map.h
+++ b/be/src/vec/columns/column_map.h
@@ -140,11 +140,26 @@ public:
         return append_data_by_selector_impl<ColumnMap>(res, selector);
     }
 
-    void replace_column_data(const IColumn&, size_t row, size_t self_row = 0) 
override {
-        LOG(FATAL) << "replace_column_data not implemented";
+    void replace_column_data(const IColumn& rhs, size_t row, size_t self_row = 
0) override {
+        DCHECK(size() > self_row);
+        const auto& r = assert_cast<const ColumnMap&>(rhs);
+        const size_t nested_row_size = r.size_at(row);
+        const size_t r_key_nested_start_off = r.offset_at(row);
+        const size_t r_val_nested_start_off = r.offset_at(row);
+
+        if (self_row == 0) {
+            keys_column->clear();
+            values_column->clear();
+        }
+        get_offsets()[self_row] = get_offsets()[self_row - 1] + 
nested_row_size;
+        // here we use batch size to avoid many virtual call in nested column
+        keys_column->insert_range_from(r.get_keys(), r_key_nested_start_off, 
nested_row_size);
+        values_column->insert_range_from(r.get_values(), 
r_val_nested_start_off, nested_row_size);
     }
+
     void replace_column_data_default(size_t self_row = 0) override {
-        LOG(FATAL) << "replace_column_data_default not implemented";
+        DCHECK(size() > self_row);
+        get_offsets()[self_row] = get_offsets()[self_row - 1];
     }
 
     ColumnArray::Offsets64& ALWAYS_INLINE get_offsets() {
diff --git a/be/src/vec/columns/column_struct.h 
b/be/src/vec/columns/column_struct.h
index 700b5801c37..820c151a941 100644
--- a/be/src/vec/columns/column_struct.h
+++ b/be/src/vec/columns/column_struct.h
@@ -34,6 +34,7 @@
 #include "common/status.h"
 #include "vec/columns/column.h"
 #include "vec/columns/column_impl.h"
+#include "vec/common/assert_cast.h"
 #include "vec/common/cow.h"
 #include "vec/common/sip_hash.h"
 #include "vec/common/string_ref.h"
@@ -130,11 +131,20 @@ public:
     void append_data_by_selector(MutableColumnPtr& res, const Selector& 
selector) const override {
         return append_data_by_selector_impl<ColumnStruct>(res, selector);
     }
-    void replace_column_data(const IColumn&, size_t row, size_t self_row = 0) 
override {
-        LOG(FATAL) << "replace_column_data not implemented";
+    void replace_column_data(const IColumn& rhs, size_t row, size_t self_row = 
0) override {
+        DCHECK(size() > self_row);
+        const auto& r = assert_cast<const ColumnStruct&>(rhs);
+
+        for (size_t idx = 0; idx < columns.size(); ++idx) {
+            columns[idx]->replace_column_data(r.get_column(idx), row, 
self_row);
+        }
     }
+
     void replace_column_data_default(size_t self_row = 0) override {
-        LOG(FATAL) << "replace_column_data_default not implemented";
+        DCHECK(size() > self_row);
+        for (size_t idx = 0; idx < columns.size(); ++idx) {
+            columns[idx]->replace_column_data_default(self_row);
+        }
     }
 
     void insert_range_from(const IColumn& src, size_t start, size_t length) 
override;
diff --git a/be/src/vec/olap/block_reader.cpp b/be/src/vec/olap/block_reader.cpp
index 0c303a97444..fe670b0bb9c 100644
--- a/be/src/vec/olap/block_reader.cpp
+++ b/be/src/vec/olap/block_reader.cpp
@@ -163,7 +163,7 @@ void BlockReader::_init_agg_state(const ReaderParams& 
read_params) {
             
_next_row.block->create_same_struct_block(_reader_context.batch_size)->mutate_columns();
 
     _stored_has_null_tag.resize(_stored_data_columns.size());
-    _stored_has_string_tag.resize(_stored_data_columns.size());
+    _stored_has_variable_length_tag.resize(_stored_data_columns.size());
 
     auto& tablet_schema = *_tablet_schema;
     for (auto idx : _agg_columns_idx) {
@@ -182,13 +182,23 @@ void BlockReader::_init_agg_state(const ReaderParams& 
read_params) {
         });
         _agg_places.push_back(place);
 
-        // calculate `has_string` tag.
-        _stored_has_string_tag[idx] =
+        // calculate `_has_variable_length_tag` tag. like string, array, map
+        _stored_has_variable_length_tag[idx] =
                 _stored_data_columns[idx]->is_column_string() ||
                 (_stored_data_columns[idx]->is_nullable() &&
                  
reinterpret_cast<ColumnNullable*>(_stored_data_columns[idx].get())
                          ->get_nested_column_ptr()
-                         ->is_column_string());
+                         ->is_column_string()) ||
+                _stored_data_columns[idx]->is_column_array() ||
+                (_stored_data_columns[idx]->is_nullable() &&
+                 
reinterpret_cast<ColumnNullable*>(_stored_data_columns[idx].get())
+                         ->get_nested_column_ptr()
+                         ->is_column_array()) ||
+                _stored_data_columns[idx]->is_column_map() ||
+                (_stored_data_columns[idx]->is_nullable() &&
+                 
reinterpret_cast<ColumnNullable*>(_stored_data_columns[idx].get())
+                         ->get_nested_column_ptr()
+                         ->is_column_map());
     }
 }
 
@@ -461,8 +471,8 @@ size_t BlockReader::_copy_agg_data() {
 
     for (auto idx : _agg_columns_idx) {
         auto& dst_column = _stored_data_columns[idx];
-        if (_stored_has_string_tag[idx]) {
-            //string type should replace ordered
+        if (_stored_has_variable_length_tag[idx]) {
+            //variable length type should replace ordered
             for (size_t i = 0; i < copy_size; i++) {
                 auto& ref = _stored_row_ref[i];
                 
dst_column->replace_column_data(*ref.block->get_by_position(idx).column,
diff --git a/be/src/vec/olap/block_reader.h b/be/src/vec/olap/block_reader.h
index b573e106694..273c21899d4 100644
--- a/be/src/vec/olap/block_reader.h
+++ b/be/src/vec/olap/block_reader.h
@@ -111,7 +111,7 @@ private:
     std::vector<IteratorRowRef> _stored_row_ref;
 
     std::vector<bool> _stored_has_null_tag;
-    std::vector<bool> _stored_has_string_tag;
+    std::vector<bool> _stored_has_variable_length_tag;
 
     phmap::flat_hash_map<const Block*, std::vector<std::pair<int, int>>> 
_temp_ref_map;
 
diff --git 
a/regression-test/data/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.out
 
b/regression-test/data/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.out
index 254ecfa7b01..e9b8e3537d7 100644
--- 
a/regression-test/data/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.out
+++ 
b/regression-test/data/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.out
@@ -2,15 +2,30 @@
 -- !sql_nested_table_agg_c --
 1
 
+-- !sql_nested_table_agg --
+\N     \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N
+
 -- !sql_nested_table_agg2_c --
 1
 
+-- !sql_nested_table_agg2 --
+\N     \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N
+
 -- !sql_nested_table_map_agg_c --
 1
 
+-- !sql_nested_table_map_agg --
+\N     \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N
+
 -- !sql_nested_table_array_map_agg_c --
 1
 
+-- !sql_nested_table_array_map_agg --
+\N     \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N
+
 -- !sql_nested_table_map_array_agg_c --
 1
 
+-- !sql_nested_table_map_array_agg --
+\N     \N      \N      \N      \N      \N      \N      \N      \N      \N      
\N      \N      \N      \N      \N      \N      \N      \N
+
diff --git 
a/regression-test/suites/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.groovy
 
b/regression-test/suites/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.groovy
index b015a73f583..4b4f3192c6d 100644
--- 
a/regression-test/suites/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.groovy
+++ 
b/regression-test/suites/datatype_p0/nested_types/negative_cases/test_nested_types_insert_into_with_agg_table.groovy
@@ -105,6 +105,7 @@ suite("test_nested_types_insert_into_with_agg_table", "p0") 
{
     }
 
     qt_sql_nested_table_agg_c """select count() from 
tbl_array_nested_types_agg;"""
+    qt_sql_nested_table_agg """select * from tbl_array_nested_types_agg;"""
 
     // test action for scala to array with array-scala type
     test {
@@ -188,6 +189,7 @@ suite("test_nested_types_insert_into_with_agg_table", "p0") 
{
     }
 
     qt_sql_nested_table_agg2_c """select count() from 
tbl_array_nested_types_agg2;"""
+    qt_sql_nested_table_agg2 """select * from tbl_array_nested_types_agg2;"""
 
 
     // test action for scala to map with map-scala-scala type
@@ -272,6 +274,7 @@ suite("test_nested_types_insert_into_with_agg_table", "p0") 
{
     }
 
     qt_sql_nested_table_map_agg_c """select count() from tbl_map_types_agg;"""
+    qt_sql_nested_table_map_agg """select * from tbl_map_types_agg;"""
 
     // test action for scala to array with map-scala-scala type
     test {
@@ -355,6 +358,7 @@ suite("test_nested_types_insert_into_with_agg_table", "p0") 
{
     }
 
     qt_sql_nested_table_array_map_agg_c """select count() from 
tbl_array_map_types_agg;"""
+    qt_sql_nested_table_array_map_agg """select * from 
tbl_array_map_types_agg;"""
 
     // test action for map with scala array-scala
     // test action for scala to array with array-scala type
@@ -439,5 +443,6 @@ suite("test_nested_types_insert_into_with_agg_table", "p0") 
{
     }
 
     qt_sql_nested_table_map_array_agg_c """select count() from 
tbl_map_array_types_agg;"""
+    qt_sql_nested_table_map_array_agg """select * from 
tbl_map_array_types_agg;"""
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to