17
17
#pragma once
18
18
19
19
#include < cstddef>
20
+ #include < cstring>
20
21
#include < memory>
21
22
#include < type_traits>
22
23
#include < AggregateFunctions/AggregateFunctionFactory.h>
@@ -118,7 +119,7 @@ class FunctionBloomFilterContains : public DB::IFunction
118
119
mutable DB::AggregateFunctionPtr agg_func;
119
120
120
121
template <typename T>
121
- typename std::enable_if <std::is_same_v<T, Int64> || std::is_same_v<T, UInt64 >, void >::type internalExecute (
122
+ std::enable_if_t <std::is_same_v<T, Int64> || std::is_same_v<T, UInt64 >, void > internalExecute (
122
123
const DB::ColumnsWithTypeAndName & arguments,
123
124
size_t input_rows_count,
124
125
typename DB::ColumnVector<UInt8 >::Container & vec_to,
@@ -129,16 +130,21 @@ class FunctionBloomFilterContains : public DB::IFunction
129
130
const auto * column_ptr = arguments[1 ].column .get ();
130
131
auto second_arg_const = isColumnConst (*column_ptr);
131
132
133
+ AggregateFunctionGroupBloomFilterData & bloom_filter_data_0
134
+ = *reinterpret_cast <AggregateFunctionGroupBloomFilterData *>(bloom_filter_state);
132
135
if (second_arg_const)
133
- container_of_int = &typeid_cast<const ColumnType &>(typeid_cast<const DB::ColumnConst &>(*column_ptr).getDataColumn ()).getData ();
134
- else
135
- container_of_int = &typeid_cast<const ColumnType &>(*column_ptr).getData ();
136
+ {
137
+ vec_to[0 ] = bloom_filter_data_0.bloom_filter .find (typeid_cast<const DB::ColumnConst &>(*column_ptr).getDataAt (0 ).data , sizeof (T));
138
+ // copy to all rows, better use constant column
139
+ std::memcpy (&vec_to[1 ], &vec_to[0 ], (input_rows_count - 1 ) * sizeof (UInt8 ));
136
140
141
+ return ;
142
+ }
143
+
144
+ container_of_int = &typeid_cast<const ColumnType &>(*column_ptr).getData ();
137
145
for (size_t i = 0 ; i < input_rows_count; ++i)
138
146
{
139
- const T v = second_arg_const ? (*container_of_int)[0 ] : (*container_of_int)[i];
140
- AggregateFunctionGroupBloomFilterData & bloom_filter_data_0
141
- = *reinterpret_cast <AggregateFunctionGroupBloomFilterData *>(bloom_filter_state);
147
+ const T v = (*container_of_int)[i];
142
148
vec_to[i] = bloom_filter_data_0.bloom_filter .find (reinterpret_cast <const char *>(&v), sizeof (T));
143
149
}
144
150
}
@@ -195,7 +201,6 @@ class FunctionBloomFilterContains : public DB::IFunction
195
201
arguments[0 ].type ->getName ());
196
202
}
197
203
198
-
199
204
const DB::IColumn * second_column_ptr = arguments[1 ].column .get ();
200
205
if (isColumnNullable (*second_column_ptr))
201
206
second_column_ptr = &typeid_cast<const DB::ColumnNullable &>(*second_column_ptr).getNestedColumn ();
0 commit comments