This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.1 in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit c4ef128d559b8a5cf989684dd95a57acf95f83b5 Author: zhangstar333 <87313068+zhangstar...@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-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org