[Vectorized][Function] fix bitmap_intersect get wrong result (#9907)
This commit is contained in:
@ -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); }
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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; """
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user