Skip to content

Commit

Permalink
Merge pull request #8082 from moon03432/master
Browse files Browse the repository at this point in the history
fix bitmapAnd error when intersecting an aggregated bitmap and a scalar bitmap
  • Loading branch information
alexey-milovidov committed Dec 21, 2019
2 parents ea56001 + caedf9d commit d52547d
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 5 deletions.
17 changes: 15 additions & 2 deletions dbms/src/Functions/FunctionsBitmap.h
Expand Up @@ -991,24 +991,37 @@ class FunctionBitmap : public IFunction
void executeBitmapData(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count)
{
const ColumnAggregateFunction * columns[2];
bool is_column_const[2];
for (size_t i = 0; i < 2; ++i)
{
if (auto argument_column_const = typeid_cast<const ColumnConst *>(block.getByPosition(arguments[i]).column.get()))
{
columns[i] = typeid_cast<const ColumnAggregateFunction *>(argument_column_const->getDataColumnPtr().get());
is_column_const[i] = true;
}
else
{
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get());
is_column_const[i] = false;
}
}

auto col_to = ColumnAggregateFunction::create(columns[0]->getAggregateFunction());

col_to->reserve(input_rows_count);

const PaddedPODArray<AggregateDataPtr> & container0 = columns[0]->getData();
const PaddedPODArray<AggregateDataPtr> & container1 = columns[1]->getData();

for (size_t i = 0; i < input_rows_count; ++i)
{
col_to->insertFrom(columns[0]->getData()[i]);
const AggregateDataPtr data_ptr_0 = is_column_const[0] ? container0[0] : container0[i];
const AggregateDataPtr data_ptr_1 = is_column_const[1] ? container1[0] : container1[i];

col_to->insertFrom(data_ptr_0);
AggregateFunctionGroupBitmapData<T> & bitmap_data_1 = *reinterpret_cast<AggregateFunctionGroupBitmapData<T> *>(col_to->getData()[i]);
const AggregateFunctionGroupBitmapData<T> & bitmap_data_2
= *reinterpret_cast<const AggregateFunctionGroupBitmapData<T> *>(columns[1]->getData()[i]);
= *reinterpret_cast<const AggregateFunctionGroupBitmapData<T> *>(data_ptr_1);
Impl<T>::apply(bitmap_data_1, bitmap_data_2);
}
block.getByPosition(result).column = std::move(col_to);
Expand Down
10 changes: 7 additions & 3 deletions dbms/tests/queries/0_stateless/00829_bitmap_function.reference
Expand Up @@ -13,15 +13,19 @@
70
2019-01-01 50 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]
2019-01-02 60 [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70]
2019-01-03 10 [1,2,3,4,5,6,7,8,9,10]
60 50 70 40 20 30
60 50 70 40 20 30
90
90
100
100
20
90
100
20
[1,2,3]
[1,2,3]
2019-01-01 50
2019-01-02 60
2019-01-03 10
1
1
1
Expand Down
4 changes: 4 additions & 0 deletions dbms/tests/queries/0_stateless/00829_bitmap_function.sql
Expand Up @@ -15,6 +15,7 @@ DROP TABLE IF EXISTS bitmap_test;
CREATE TABLE bitmap_test(pickup_date Date, city_id UInt32, uid UInt32)ENGINE = Memory;
INSERT INTO bitmap_test SELECT '2019-01-01', 1, number FROM numbers(1,50);
INSERT INTO bitmap_test SELECT '2019-01-02', 1, number FROM numbers(11,60);
INSERT INTO bitmap_test SELECT '2019-01-03', 2, number FROM numbers(1,10);


SELECT groupBitmap( uid ) AS user_num FROM bitmap_test;
Expand Down Expand Up @@ -65,6 +66,9 @@ SELECT count(*) FROM bitmap_test WHERE bitmapContains((SELECT groupBitmapState(u

SELECT count(*) FROM bitmap_test WHERE 0 = bitmapContains((SELECT groupBitmapState(uid) FROM bitmap_test WHERE pickup_date = '2019-01-01'), uid);

-- PR#8082
SELECT bitmapToArray(bitmapAnd(groupBitmapState(uid), bitmapBuild(CAST([1, 2, 3], 'Array(UInt32)')))) FROM bitmap_test GROUP BY city_id;

-- bitmap state test
DROP TABLE IF EXISTS bitmap_state_test;
CREATE TABLE bitmap_state_test
Expand Down

0 comments on commit d52547d

Please sign in to comment.