Fix bitmap functions crash the server bug segfault

This commit is contained in:
Andy Yang 2019-05-09 17:24:36 +08:00
parent 8dd7d4d46b
commit 4b66622601
3 changed files with 38 additions and 3 deletions

View File

@ -406,7 +406,12 @@ private:
{ {
const ColumnAggregateFunction * columns[2]; const ColumnAggregateFunction * columns[2];
for (size_t i = 0; i < 2; ++i) for (size_t i = 0; i < 2; ++i)
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get()); {
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());
else
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get());
}
for (size_t i = 0; i < input_rows_count; ++i) for (size_t i = 0; i < input_rows_count; ++i)
{ {
@ -511,7 +516,12 @@ private:
{ {
const ColumnAggregateFunction * columns[2]; const ColumnAggregateFunction * columns[2];
for (size_t i = 0; i < 2; ++i) for (size_t i = 0; i < 2; ++i)
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get()); {
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());
else
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get());
}
auto col_to = ColumnAggregateFunction::create(columns[0]->getAggregateFunction()); auto col_to = ColumnAggregateFunction::create(columns[0]->getAggregateFunction());

View File

@ -15,3 +15,7 @@
60 50 70 40 20 30 60 50 70 40 20 30
2019-01-01 50 2019-01-01 50
2019-01-02 60 2019-01-02 60
1
1
1
1

View File

@ -1,3 +1,4 @@
USE test;
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])); SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5]));
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))); SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])));
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))); SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])));
@ -53,7 +54,7 @@ ALL LEFT JOIN
) )
USING city_id; USING city_id;
-- bitmap state test
DROP TABLE IF EXISTS bitmap_state_test; DROP TABLE IF EXISTS bitmap_state_test;
CREATE TABLE bitmap_state_test CREATE TABLE bitmap_state_test
( (
@ -72,6 +73,26 @@ GROUP BY pickup_date, city_id;
SELECT pickup_date, groupBitmapMerge(uv) AS users from bitmap_state_test group by pickup_date; SELECT pickup_date, groupBitmapMerge(uv) AS users from bitmap_state_test group by pickup_date;
-- between column and expression test
DROP TABLE IF EXISTS bitmap_column_expr_test;
CREATE TABLE bitmap_column_expr_test
(
t DateTime,
z AggregateFunction(groupBitmap, UInt32)
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(t)
ORDER BY t;
INSERT INTO bitmap_column_expr_test VALUES (now(), bitmapBuild(cast([3,19,47] as Array(UInt32))));
SELECT bitmapAndCardinality( bitmapBuild(cast([19,7] as Array(UInt32))), z) from bitmap_column_expr_test;
SELECT bitmapAndCardinality( z, bitmapBuild(cast([19,7] as Array(UInt32))) ) from bitmap_column_expr_test;
select bitmapCardinality(bitmapAnd(bitmapBuild(cast([19,7] as Array(UInt32))), z )) from bitmap_column_expr_test;
select bitmapCardinality(bitmapAnd(z, bitmapBuild(cast([19,7] as Array(UInt32))))) from bitmap_column_expr_test;
DROP TABLE IF EXISTS bitmap_test; DROP TABLE IF EXISTS bitmap_test;
DROP TABLE IF EXISTS bitmap_state_test; DROP TABLE IF EXISTS bitmap_state_test;
DROP TABLE IF EXISTS bitmap_column_expr_test;