[Fix](array-type) bugfix for array column with delete condition (#13361)
Fix for SQL with array column: delete from tbl where c_array is null; more info please refer to #13360 Co-authored-by: cambyzju <zhuxiaoli01@baidu.com>
This commit is contained in:
@ -503,6 +503,38 @@ void ColumnArray::insert_indices_from(const IColumn& src, const int* indices_beg
|
||||
}
|
||||
}
|
||||
|
||||
Status ColumnArray::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) {
|
||||
auto to = reinterpret_cast<vectorized::ColumnArray*>(col_ptr);
|
||||
auto& to_offsets = to->get_offsets();
|
||||
|
||||
size_t element_size = 0;
|
||||
size_t max_offset = 0;
|
||||
for (size_t i = 0; i < sel_size; ++i) {
|
||||
element_size += size_at(sel[i]);
|
||||
max_offset = std::max(max_offset, offset_at(sel[i]));
|
||||
}
|
||||
if (max_offset > std::numeric_limits<uint16_t>::max()) {
|
||||
return Status::IOError("array elements too large than uint16_t::max");
|
||||
}
|
||||
|
||||
to_offsets.reserve(to_offsets.size() + sel_size);
|
||||
auto nested_sel = std::make_unique<uint16_t[]>(element_size);
|
||||
size_t nested_sel_size = 0;
|
||||
for (size_t i = 0; i < sel_size; ++i) {
|
||||
auto row_off = offset_at(sel[i]);
|
||||
auto row_size = size_at(sel[i]);
|
||||
to_offsets.push_back(to_offsets.back() + row_size);
|
||||
for (auto j = 0; j < row_size; ++j) {
|
||||
nested_sel[nested_sel_size++] = row_off + j;
|
||||
}
|
||||
}
|
||||
|
||||
if (nested_sel_size > 0) {
|
||||
return data->filter_by_selector(nested_sel.get(), nested_sel_size, &to->get_data());
|
||||
}
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
ColumnPtr ColumnArray::replicate(const IColumn::Offsets& replicate_offsets) const {
|
||||
if (replicate_offsets.empty()) return clone_empty();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user