You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/06/01 15:51:59 UTC

[incubator-doris] branch master updated: [Vectorized][Function] fix bitmap_intersect get wrong result (#9907)

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/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e896fffd76 [Vectorized][Function] fix bitmap_intersect get wrong result (#9907)
e896fffd76 is described below

commit e896fffd7676ea1b5bb45e51cff0042d9b02b9e7
Author: zhangstar333 <87...@users.noreply.github.com>
AuthorDate: Wed Jun 1 23:51:52 2022 +0800

    [Vectorized][Function] fix bitmap_intersect get wrong result (#9907)
---
 .../aggregate_function_bitmap.h                    | 13 +++++--
 .../data/correctness/test_bitmap_intersect.out     |  4 +++
 .../correctness/test_bitmap_intersect.groovy       | 41 ++++++++++++++++++++++
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/be/src/vec/aggregate_functions/aggregate_function_bitmap.h b/be/src/vec/aggregate_functions/aggregate_function_bitmap.h
index 939421656e..f4a237dbb9 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_bitmap.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_bitmap.h
@@ -38,7 +38,7 @@ struct AggregateFunctionBitmapUnionOp {
 
     static void add(BitmapValue& res, const BitmapValue& data, bool& is_first) { res |= data; }
 
-    static void merge(BitmapValue& res, const BitmapValue& data) { res |= data; }
+    static void merge(BitmapValue& res, const BitmapValue& data, bool& is_first) { res |= data; }
 };
 
 struct AggregateFunctionBitmapIntersectOp {
@@ -53,7 +53,14 @@ struct AggregateFunctionBitmapIntersectOp {
         }
     }
 
-    static void merge(BitmapValue& res, const BitmapValue& data) { res &= data; }
+    static void merge(BitmapValue& res, const BitmapValue& data, bool& is_first) {
+        if (UNLIKELY(is_first)) {
+            res = data;
+            is_first = false;
+        } else {
+            res &= data;
+        }
+    }
 };
 
 template <typename Op>
@@ -66,7 +73,7 @@ struct AggregateFunctionBitmapData {
         Op::add(value, data, is_first);
     }
 
-    void merge(const BitmapValue& data) { Op::merge(value, data); }
+    void merge(const BitmapValue& data) { Op::merge(value, data, is_first); }
 
     void write(BufferWritable& buf) const { DataTypeBitMap::serialize_as_stream(value, buf); }
 
diff --git a/regression-test/data/correctness/test_bitmap_intersect.out b/regression-test/data/correctness/test_bitmap_intersect.out
new file mode 100644
index 0000000000..eb88af08bf
--- /dev/null
+++ b/regression-test/data/correctness/test_bitmap_intersect.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_default --
+1,2
+
diff --git a/regression-test/suites/correctness/test_bitmap_intersect.groovy b/regression-test/suites/correctness/test_bitmap_intersect.groovy
new file mode 100644
index 0000000000..63fd337411
--- /dev/null
+++ b/regression-test/suites/correctness/test_bitmap_intersect.groovy
@@ -0,0 +1,41 @@
+// 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_intersect") {
+     def tableName = "test_bitmap"
+
+
+     sql """ DROP TABLE IF EXISTS ${tableName} """
+     sql """
+        create table ${tableName} (tag varchar(20),user_ids bitmap bitmap_union) aggregate key (tag) 
+        distributed by hash (tag) PROPERTIES("replication_num" = "1"); 
+     """
+
+     sql "   insert into ${tableName} values('A', to_bitmap(1)); "
+     sql "   insert into ${tableName} values('A', to_bitmap(2)); "
+     sql "   insert into ${tableName} values('A', to_bitmap(3)); "
+     sql "   insert into ${tableName} values('B', to_bitmap(1)); "
+     sql "   insert into ${tableName} values('B', to_bitmap(2)); "
+    
+     // test_vectorized
+     sql """ set enable_vectorized_engine = true; """
+
+     qt_select_default """ 
+     select bitmap_to_string(bitmap_intersect(user_ids)) from ( select tag, bitmap_union(user_ids) user_ids 
+     from ${tableName} group by tag ) t;  """
+
+ }
\ No newline at end of file


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