[Vectorized][Function] fix bitmap_intersect get wrong result (#9907)

This commit is contained in:
zhangstar333
2022-06-01 23:51:52 +08:00
committed by GitHub
parent fccb7b8055
commit e896fffd76
3 changed files with 55 additions and 3 deletions

View File

@ -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); }

View File

@ -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

View File

@ -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; """
}