From 89c8c31fa81a9a96a43452b32ef8936bee1adae4 Mon Sep 17 00:00:00 2001 From: HappenLee Date: Wed, 17 Apr 2024 22:26:32 +0800 Subject: [PATCH 1/2] [exec](table_fun) opt numbers table func performance --- .../exprs/table_function/vexplode_numbers.h | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/be/src/vec/exprs/table_function/vexplode_numbers.h b/be/src/vec/exprs/table_function/vexplode_numbers.h index 211565ec8b4f77..a60feba1adc5ab 100644 --- a/be/src/vec/exprs/table_function/vexplode_numbers.h +++ b/be/src/vec/exprs/table_function/vexplode_numbers.h @@ -28,11 +28,9 @@ #include "vec/data_types/data_type.h" #include "vec/exprs/table_function/table_function.h" -namespace doris { -namespace vectorized { +namespace doris::vectorized { class Block; -} // namespace vectorized -} // namespace doris +} // namespace doris::vectorized namespace doris::vectorized { @@ -48,8 +46,8 @@ class VExplodeNumbersTableFunction : public TableFunction { void process_close() override; void get_value(MutableColumnPtr& column) override; int get_value(MutableColumnPtr& column, int max_step) override { + max_step = std::min(max_step, (int)(_cur_size - _cur_offset)); if (_is_const) { - max_step = std::min(max_step, (int)(_cur_size - _cur_offset)); if (_is_nullable) { static_cast( static_cast(column.get())->get_nested_column_ptr().get()) @@ -61,12 +59,24 @@ class VExplodeNumbersTableFunction : public TableFunction { static_cast(column.get()) ->insert_range_from(*_elements_column, _cur_offset, max_step); } - - forward(max_step); - return max_step; + } else { + ColumnInt32* target = nullptr; + if (_is_nullable) { + target = assert_cast( + assert_cast(column.get())->get_nested_column_ptr().get()); + assert_cast( + assert_cast(column.get())->get_null_map_column_ptr().get()) + ->insert_many_defaults(max_step); + } else { + target = assert_cast(column.get()); + } + auto origin_size = target->size(); + target->resize(origin_size + max_step); + std::iota(target->get_data().data() + origin_size, + target->get_data().data() + origin_size + max_step, _cur_offset); } - - return TableFunction::get_value(column, max_step); + forward(max_step); + return max_step; } private: From ecc46e2a24e9b4be42a34cac0fd45ce3d47701cb Mon Sep 17 00:00:00 2001 From: HappenLee Date: Thu, 18 Apr 2024 01:03:26 +0800 Subject: [PATCH 2/2] fix 0 value --- .../exprs/table_function/vexplode_numbers.h | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/be/src/vec/exprs/table_function/vexplode_numbers.h b/be/src/vec/exprs/table_function/vexplode_numbers.h index a60feba1adc5ab..1890719c689aa6 100644 --- a/be/src/vec/exprs/table_function/vexplode_numbers.h +++ b/be/src/vec/exprs/table_function/vexplode_numbers.h @@ -60,20 +60,28 @@ class VExplodeNumbersTableFunction : public TableFunction { ->insert_range_from(*_elements_column, _cur_offset, max_step); } } else { - ColumnInt32* target = nullptr; - if (_is_nullable) { - target = assert_cast( - assert_cast(column.get())->get_nested_column_ptr().get()); - assert_cast( - assert_cast(column.get())->get_null_map_column_ptr().get()) - ->insert_many_defaults(max_step); + // should dispose the empty status, forward one step + if (current_empty()) { + column->insert_default(); + max_step = 1; } else { - target = assert_cast(column.get()); + ColumnInt32* target = nullptr; + if (_is_nullable) { + target = assert_cast(assert_cast(column.get()) + ->get_nested_column_ptr() + .get()); + assert_cast(assert_cast(column.get()) + ->get_null_map_column_ptr() + .get()) + ->insert_many_defaults(max_step); + } else { + target = assert_cast(column.get()); + } + auto origin_size = target->size(); + target->resize(origin_size + max_step); + std::iota(target->get_data().data() + origin_size, + target->get_data().data() + origin_size + max_step, _cur_offset); } - auto origin_size = target->size(); - target->resize(origin_size + max_step); - std::iota(target->get_data().data() + origin_size, - target->get_data().data() + origin_size + max_step, _cur_offset); } forward(max_step); return max_step;