3131#include " common/object_pool.h"
3232#include " core/block/block.h"
3333#include " core/block/column_with_type_and_name.h"
34- #include " core/block/materialize_block.h"
3534#include " core/data_type/data_type_agg_state.h"
3635#include " core/data_type/data_type_factory.hpp"
3736#include " exec/common/util.hpp"
@@ -282,28 +281,35 @@ void AggFnEvaluator::destroy(AggregateDataPtr place) {
282281
283282Status AggFnEvaluator::execute_single_add (Block* block, AggregateDataPtr place, Arena& arena) {
284283 RETURN_IF_ERROR (_calc_argument_columns (block));
285- _function->add_batch_single_place (block->rows (), place, _agg_columns.data (), arena);
284+ _function->add_batch_single_place (block->rows (), place, _agg_raw_input_columns.data (), arena);
285+ _reset_input_columns ();
286286 return Status::OK ();
287287}
288288
289289Status AggFnEvaluator::execute_batch_add (Block* block, size_t offset, AggregateDataPtr* places,
290290 Arena& arena, bool agg_many) {
291291 RETURN_IF_ERROR (_calc_argument_columns (block));
292- _function->add_batch (block->rows (), places, offset, _agg_columns.data (), arena, agg_many);
292+ _function->add_batch (block->rows (), places, offset, _agg_raw_input_columns.data (), arena,
293+ agg_many);
294+ _reset_input_columns ();
293295 return Status::OK ();
294296}
295297
296298Status AggFnEvaluator::execute_batch_add_selected (Block* block, size_t offset,
297299 AggregateDataPtr* places, Arena& arena) {
298300 RETURN_IF_ERROR (_calc_argument_columns (block));
299- _function->add_batch_selected (block->rows (), places, offset, _agg_columns.data (), arena);
301+ _function->add_batch_selected (block->rows (), places, offset, _agg_raw_input_columns.data (),
302+ arena);
303+ _reset_input_columns ();
300304 return Status::OK ();
301305}
302306
303307Status AggFnEvaluator::streaming_agg_serialize_to_column (Block* block, MutableColumnPtr& dst,
304308 const size_t num_rows, Arena& arena) {
305309 RETURN_IF_ERROR (_calc_argument_columns (block));
306- _function->streaming_agg_serialize_to_column (_agg_columns.data (), dst, num_rows, arena);
310+ _function->streaming_agg_serialize_to_column (_agg_raw_input_columns.data (), dst, num_rows,
311+ arena);
312+ _reset_input_columns ();
307313 return Status::OK ();
308314}
309315
@@ -340,23 +346,28 @@ std::string AggFnEvaluator::debug_string() const {
340346 return out.str ();
341347}
342348
343- Status AggFnEvaluator::_calc_argument_columns (Block* block) {
349+ Status AggFnEvaluator::_calc_argument_columns (const Block* block) {
344350 SCOPED_TIMER (_expr_timer);
345- _agg_columns .resize (_input_exprs_ctxs.size ());
346- std::vector< int > column_ids (_input_exprs_ctxs.size ());
351+ _agg_input_columns .resize (_input_exprs_ctxs.size (), nullptr );
352+ _agg_raw_input_columns. resize (_input_exprs_ctxs.size (), nullptr );
347353 for (int i = 0 ; i < _input_exprs_ctxs.size (); ++i) {
348- int column_id = -1 ;
349- RETURN_IF_ERROR (_input_exprs_ctxs[i]->execute (block, &column_id));
350- column_ids[i] = column_id;
351- }
352- materialize_block_inplace (*block, column_ids.data (),
353- column_ids.data () + _input_exprs_ctxs.size ());
354- for (int i = 0 ; i < _input_exprs_ctxs.size (); ++i) {
355- _agg_columns[i] = block->get_by_position (column_ids[i]).column .get ();
354+ RETURN_IF_ERROR (_input_exprs_ctxs[i]->execute (block, _agg_input_columns[i]));
355+ _agg_input_columns[i] = _agg_input_columns[i]->convert_to_full_column_if_const ();
356+ _agg_raw_input_columns[i] = _agg_input_columns[i].get ();
356357 }
357358 return Status::OK ();
358359}
359360
361+ void AggFnEvaluator::_reset_input_columns () {
362+ SCOPED_TIMER (_expr_timer);
363+ for (auto & col : _agg_input_columns) {
364+ col = nullptr ;
365+ }
366+ for (auto & col : _agg_raw_input_columns) {
367+ col = nullptr ;
368+ }
369+ }
370+
360371AggFnEvaluator* AggFnEvaluator::clone (RuntimeState* state, ObjectPool* pool) {
361372 return pool->add (AggFnEvaluator::create_unique (*this , state).release ());
362373}
@@ -374,7 +385,8 @@ AggFnEvaluator::AggFnEvaluator(AggFnEvaluator& evaluator, RuntimeState* state)
374385 _data_type(evaluator._data_type),
375386 _function(evaluator._function),
376387 _expr_name(evaluator._expr_name),
377- _agg_columns(evaluator._agg_columns) {
388+ _agg_input_columns(evaluator._agg_input_columns),
389+ _agg_raw_input_columns(evaluator._agg_raw_input_columns) {
378390 if (evaluator._fn .binary_type == TFunctionBinaryType::JAVA_UDF) {
379391 DataTypes tmp_argument_types;
380392 tmp_argument_types.reserve (evaluator._input_exprs_ctxs .size ());
0 commit comments