[bugfix]fix default value get wrong result because no implement read_by_rowids (#10582)

This commit is contained in:
Pxl
2022-07-04 19:30:49 +08:00
committed by GitHub
parent 1cee0a7028
commit e68ab0084b
4 changed files with 41 additions and 22 deletions

View File

@ -755,7 +755,9 @@ Status FileColumnIterator::read_by_rowids(const rowid_t* rowids, const size_t co
}
}
if (!is_null) _page.data_decoder->seek_to_position_in_page(origin_index + this_run);
if (!is_null) {
_page.data_decoder->seek_to_position_in_page(origin_index + this_run);
}
already_read += this_read_count;
_page.offset_in_page += this_run;
@ -766,8 +768,8 @@ Status FileColumnIterator::read_by_rowids(const rowid_t* rowids, const size_t co
total_read_count += nrows_to_read;
remaining -= nrows_to_read;
} else {
_page.data_decoder->read_by_rowids(&rowids[total_read_count], _page.first_ordinal,
&nrows_to_read, dst);
RETURN_IF_ERROR(_page.data_decoder->read_by_rowids(
&rowids[total_read_count], _page.first_ordinal, &nrows_to_read, dst));
total_read_count += nrows_to_read;
remaining -= nrows_to_read;
}
@ -990,16 +992,24 @@ void DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info,
Status DefaultValueColumnIterator::next_batch(size_t* n, vectorized::MutableColumnPtr& dst,
bool* has_null) {
if (_is_default_value_null) {
*has_null = true;
dst->insert_many_defaults(*n);
} else {
*has_null = false;
insert_default_data(_type_info.get(), _type_size, _mem_value, dst, *n);
}
*has_null = _is_default_value_null;
_insert_many_default(dst, *n);
return Status::OK();
}
Status DefaultValueColumnIterator::read_by_rowids(const rowid_t* rowids, const size_t count,
vectorized::MutableColumnPtr& dst) {
_insert_many_default(dst, count);
return Status::OK();
}
void DefaultValueColumnIterator::_insert_many_default(vectorized::MutableColumnPtr& dst, size_t n) {
if (_is_default_value_null) {
dst->insert_many_defaults(n);
} else {
insert_default_data(_type_info.get(), _type_size, _mem_value, dst, n);
}
}
} // namespace segment_v2
} // namespace doris

View File

@ -136,7 +136,7 @@ public:
CompressionTypePB get_compression() const { return _meta.compression(); }
uint64_t num_rows() { return _num_rows; }
uint64_t num_rows() const { return _num_rows; }
void set_dict_encoding_type(DictEncodingType type) {
std::call_once(_set_dict_encoding_type_flag, [&] { _dict_encoding_type = type; });
@ -455,12 +455,17 @@ public:
Status next_batch(size_t* n, vectorized::MutableColumnPtr& dst, bool* has_null) override;
Status read_by_rowids(const rowid_t* rowids, const size_t count,
vectorized::MutableColumnPtr& dst) override;
ordinal_t get_current_ordinal() const override { return _current_rowid; }
static void insert_default_data(const TypeInfo* type_info, size_t type_size, void* mem_value,
vectorized::MutableColumnPtr& dst, size_t n);
private:
void _insert_many_default(vectorized::MutableColumnPtr& dst, size_t n);
bool _has_default_value;
std::string _default_value;
bool _is_nullable;

View File

@ -21,6 +21,7 @@
#include <set>
#include <utility>
#include "common/status.h"
#include "gutil/strings/substitute.h"
#include "olap/column_predicate.h"
#include "olap/fs/fs_util.h"
@ -947,10 +948,10 @@ uint16_t SegmentIterator::_evaluate_short_circuit_predicate(uint16_t* vec_sel_ro
return selected_size;
}
void SegmentIterator::_read_columns_by_rowids(std::vector<ColumnId>& read_column_ids,
std::vector<rowid_t>& rowid_vector,
uint16_t* sel_rowid_idx, size_t select_size,
vectorized::MutableColumns* mutable_columns) {
Status SegmentIterator::_read_columns_by_rowids(std::vector<ColumnId>& read_column_ids,
std::vector<rowid_t>& rowid_vector,
uint16_t* sel_rowid_idx, size_t select_size,
vectorized::MutableColumns* mutable_columns) {
SCOPED_RAW_TIMER(&_opts.stats->lazy_read_ns);
std::vector<rowid_t> rowids(select_size);
for (size_t i = 0; i < select_size; ++i) {
@ -958,8 +959,10 @@ void SegmentIterator::_read_columns_by_rowids(std::vector<ColumnId>& read_column
}
for (auto cid : read_column_ids) {
auto& column = (*mutable_columns)[cid];
_column_iterators[cid]->read_by_rowids(rowids.data(), select_size, column);
RETURN_IF_ERROR(_column_iterators[cid]->read_by_rowids(rowids.data(), select_size, column));
}
return Status::OK();
}
Status SegmentIterator::next_batch(vectorized::Block* block) {
@ -1044,8 +1047,9 @@ Status SegmentIterator::next_batch(vectorized::Block* block) {
}
// step3: read non_predicate column
_read_columns_by_rowids(_non_predicate_columns, _block_rowids, sel_rowid_idx, selected_size,
&_current_return_columns);
RETURN_IF_ERROR(_read_columns_by_rowids(_non_predicate_columns, _block_rowids,
sel_rowid_idx, selected_size,
&_current_return_columns));
// step4: output columns
// 4.1 output non-predicate column

View File

@ -102,9 +102,9 @@ private:
uint16_t _evaluate_vectorization_predicate(uint16_t* sel_rowid_idx, uint16_t selected_size);
uint16_t _evaluate_short_circuit_predicate(uint16_t* sel_rowid_idx, uint16_t selected_size);
void _output_non_pred_columns(vectorized::Block* block);
void _read_columns_by_rowids(std::vector<ColumnId>& read_column_ids,
std::vector<rowid_t>& rowid_vector, uint16_t* sel_rowid_idx,
size_t select_size, vectorized::MutableColumns* mutable_columns);
Status _read_columns_by_rowids(std::vector<ColumnId>& read_column_ids,
std::vector<rowid_t>& rowid_vector, uint16_t* sel_rowid_idx,
size_t select_size, vectorized::MutableColumns* mutable_columns);
template <class Container>
Status _output_column_by_sel_idx(vectorized::Block* block, const Container& column_ids,