This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit ea19224d1463f088948cb75270804648f3912769 Author: HappenLee <happen...@hotmail.com> AuthorDate: Thu Apr 18 11:39:45 2024 +0800 [exec](table_fun) opt numbers table func performance (#33804) --- be/src/vec/exprs/table_function/vexplode_numbers.h | 38 ++++++++++++++++------ 1 file changed, 28 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 211565ec8b4..1890719c689 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 @@ public: 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<ColumnInt32*>( static_cast<ColumnNullable*>(column.get())->get_nested_column_ptr().get()) @@ -61,12 +59,32 @@ public: static_cast<ColumnInt32*>(column.get()) ->insert_range_from(*_elements_column, _cur_offset, max_step); } - - forward(max_step); - return max_step; + } else { + // should dispose the empty status, forward one step + if (current_empty()) { + column->insert_default(); + max_step = 1; + } else { + ColumnInt32* target = nullptr; + if (_is_nullable) { + target = assert_cast<ColumnInt32*>(assert_cast<ColumnNullable*>(column.get()) + ->get_nested_column_ptr() + .get()); + assert_cast<ColumnUInt8*>(assert_cast<ColumnNullable*>(column.get()) + ->get_null_map_column_ptr() + .get()) + ->insert_many_defaults(max_step); + } else { + target = assert_cast<ColumnInt32*>(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: --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org