Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 28 additions & 10 deletions be/src/vec/exprs/table_function/vexplode_numbers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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<ColumnInt32*>(
static_cast<ColumnNullable*>(column.get())->get_nested_column_ptr().get())
Expand All @@ -61,12 +59,32 @@ class VExplodeNumbersTableFunction : public TableFunction {
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:
Expand Down