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 64c2437be5 [fix](coalesce) support coalesce function for bitmap
(#17798)
64c2437be5 is described below
commit 64c2437be5ad425084bc9ba6ce7e363e8baf4667
Author: TengJianPing <[email protected]>
AuthorDate: Wed Mar 15 09:34:44 2023 +0800
[fix](coalesce) support coalesce function for bitmap (#17798)
---
be/src/vec/functions/function_coalesce.cpp | 40 +++++++-
.../datatype_p0/bitmap/test_bitmap_coalesce.out | 8 ++
.../datatype_p0/bitmap/test_bitmap_coalesce.groovy | 102 +++++++++++++++++++++
3 files changed, 145 insertions(+), 5 deletions(-)
diff --git a/be/src/vec/functions/function_coalesce.cpp
b/be/src/vec/functions/function_coalesce.cpp
index 1d1ae5d593..c7edcd74ce 100644
--- a/be/src/vec/functions/function_coalesce.cpp
+++ b/be/src/vec/functions/function_coalesce.cpp
@@ -166,8 +166,9 @@ public:
//if not string type, could check one column firstly,
//and then fill the not null value in result column,
//this method may result in higher CPU cache
- filled_result_column(result_type, result_column,
argument_columns[i], null_map_data,
- filled_flags.data(), input_rows_count);
+ RETURN_IF_ERROR(filled_result_column(result_type,
result_column,
+ argument_columns[i],
null_map_data,
+ filled_flags.data(),
input_rows_count));
}
}
@@ -212,9 +213,32 @@ public:
return Status::OK();
}
- Status filled_result_column(const DataTypePtr& data_type,
MutableColumnPtr& result_column,
- ColumnPtr& argument_column, UInt8* __restrict
null_map_data,
- UInt8* __restrict filled_flag, const size_t
input_rows_count) {
+ Status insert_result_data_bitmap(MutableColumnPtr& result_column,
ColumnPtr& argument_column,
+ const UInt8* __restrict null_map_data,
+ UInt8* __restrict filled_flag, const
size_t input_rows_count) {
+ auto* __restrict result_raw_data =
+
reinterpret_cast<ColumnBitmap*>(result_column.get())->get_data().data();
+ auto* __restrict column_raw_data =
+ reinterpret_cast<const
ColumnBitmap*>(argument_column.get())->get_data().data();
+
+ // Here it's SIMD thought the compiler automatically also
+ // true: null_map_data[row]==0 && filled_idx[row]==0
+ // if true, could filled current row data into result column
+ for (size_t row = 0; row < input_rows_count; ++row) {
+ if (!(null_map_data[row] | filled_flag[row])) {
+ result_raw_data[row] = column_raw_data[row];
+ }
+ filled_flag[row] += (!(null_map_data[row] | filled_flag[row]));
+ }
+ return Status::OK();
+ }
+
+ [[nodiscard]] Status filled_result_column(const DataTypePtr& data_type,
+ MutableColumnPtr& result_column,
+ ColumnPtr& argument_column,
+ UInt8* __restrict null_map_data,
+ UInt8* __restrict filled_flag,
+ const size_t input_rows_count) {
WhichDataType which(data_type->is_nullable()
? reinterpret_cast<const
DataTypeNullable*>(data_type.get())
->get_nested_type()
@@ -227,6 +251,12 @@ public:
DECIMAL_TYPE_TO_COLUMN_TYPE(DISPATCH)
TIME_TYPE_TO_COLUMN_TYPE(DISPATCH)
#undef DISPATCH
+
+ if (which.idx == TypeIndex::BitMap) {
+ return insert_result_data_bitmap(result_column, argument_column,
null_map_data,
+ filled_flag, input_rows_count);
+ }
+
return Status::NotSupported("argument_type {} not supported",
data_type->get_name());
}
};
diff --git a/regression-test/data/datatype_p0/bitmap/test_bitmap_coalesce.out
b/regression-test/data/datatype_p0/bitmap/test_bitmap_coalesce.out
new file mode 100644
index 0000000000..3b02873531
--- /dev/null
+++ b/regression-test/data/datatype_p0/bitmap/test_bitmap_coalesce.out
@@ -0,0 +1,8 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !sql_bitmap_coalesce --
+70018 A1 A A1 A1 1 1
+70019 A A1 A1 A1 1 1
+70020 A1,2 A1 A1,2 A1,2 2 2
+70021 A2 \N A2 A2 1 1
+70022 \N A2 A2 A2 1 1
+
diff --git
a/regression-test/suites/datatype_p0/bitmap/test_bitmap_coalesce.groovy
b/regression-test/suites/datatype_p0/bitmap/test_bitmap_coalesce.groovy
new file mode 100644
index 0000000000..594ccb53d9
--- /dev/null
+++ b/regression-test/suites/datatype_p0/bitmap/test_bitmap_coalesce.groovy
@@ -0,0 +1,102 @@
+// 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_bitmap_coalesce") {
+ sql """DROP TABLE IF EXISTS `test_bitmap_t0`"""
+ sql """
+ CREATE TABLE `test_bitmap_t0` (
+ `org_sid` int(11) NOT NULL DEFAULT "0",
+ `ct_sid` int(11) NOT NULL DEFAULT "0",
+ `userid_bitmap` bitmap BITMAP_UNION NOT NULL
+ ) ENGINE=OLAP
+ AGGREGATE KEY(`org_sid`, `ct_sid`)
+ DISTRIBUTED BY HASH(`org_sid`) BUCKETS 4
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql """DROP TABLE IF EXISTS `test_bitmap_t1`"""
+ sql """
+ CREATE TABLE `test_bitmap_t1` (
+ `org_sid` int(11) NOT NULL DEFAULT "0",
+ `ct_sid` int(11) NOT NULL DEFAULT "0",
+ `userid_bitmap` bitmap BITMAP_UNION NOT NULL
+ ) ENGINE=OLAP
+ AGGREGATE KEY(`org_sid`, `ct_sid`)
+ DISTRIBUTED BY HASH(`org_sid`) BUCKETS 4
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql """
+ INSERT INTO test_bitmap_t0
+ (org_sid,ct_sid,userid_bitmap)
+ VALUES
+ (70018,70018,bitmap_from_string('1')),
+ (70019,70019,bitmap_from_string('')),
+ (70020,70020,bitmap_from_string('1,2')),
+ (70021,70021,bitmap_from_string('2'));
+ """
+
+
+ sql """
+ INSERT INTO test_bitmap_t1
+ (org_sid,ct_sid,userid_bitmap)
+ VALUES
+ (70018,70018,bitmap_from_string('')),
+ (70019,70019,bitmap_from_string('1')),
+ (70020,70020,bitmap_from_string('1')),
+ (70022,70022,bitmap_from_string('2'));
+ """
+
+ qt_sql_bitmap_coalesce """
+ with tmp as(
+ select
+ COALESCE (t0.org_sid ,t1.org_sid),
+ COALESCE (t0.ct_sid,t1.ct_sid) ct_sid,
+ t0.userid_bitmap userid_bitmap0,
+ t1.userid_bitmap userid_bitmap1,
+ bitmap_or( COALESCE(t0.userid_bitmap,bitmap_empty())
,COALESCE(t1.userid_bitmap,bitmap_empty()) ) bitmap_or1 ,
+ bitmap_or( t0.userid_bitmap ,t1.userid_bitmap ) bitmap_or2
+ from
+ (select
+ org_sid ,ct_sid , userid_bitmap
+ from test_bitmap_t0
+ ) t0
+ full join
+ (select
+ org_sid, ct_sid,
+ bitmap_union( userid_bitmap) userid_bitmap
+ from test_bitmap_t1
+ group by 1,2
+ ) t1 on
+ t0.org_sid = t1.org_sid
+ and t0.ct_sid = t1.ct_sid
+ )
+ select ct_sid,
+ concat("A", bitmap_to_string(userid_bitmap0)) bitmap0_str,
+ concat("A", bitmap_to_string(userid_bitmap1)) bitmap1_str,
+ concat("A", bitmap_to_string(bitmap_or1)) bitmap_or1_str,
+ concat("A", bitmap_to_string(bitmap_or2)) bitmap_or2_str,
+ bitmap_count(bitmap_or1) bitmap_or1_count,
+ bitmap_count(bitmap_or2) bitmap_or2_count
+ from tmp
+ order by ct_sid;
+ """
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]