This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new e68ab0084b [bugfix]fix default value get wrong result because no
implement read_by_rowids (#10582)
e68ab0084b is described below
commit e68ab0084b7bc7509bf22b8ccca6535a65d09485
Author: Pxl <[email protected]>
AuthorDate: Mon Jul 4 19:30:49 2022 +0800
[bugfix]fix default value get wrong result because no implement
read_by_rowids (#10582)
---
be/src/olap/rowset/segment_v2/column_reader.cpp | 28 +++++++++++++++-------
be/src/olap/rowset/segment_v2/column_reader.h | 7 +++++-
be/src/olap/rowset/segment_v2/segment_iterator.cpp | 18 ++++++++------
be/src/olap/rowset/segment_v2/segment_iterator.h | 6 ++---
4 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp
b/be/src/olap/rowset/segment_v2/column_reader.cpp
index ce0ea63d7d..3018feb099 100644
--- a/be/src/olap/rowset/segment_v2/column_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/column_reader.cpp
@@ -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,15 +992,23 @@ void
DefaultValueColumnIterator::insert_default_data(const TypeInfo* type_info,
Status DefaultValueColumnIterator::next_batch(size_t* n,
vectorized::MutableColumnPtr& dst,
bool* has_null) {
+ *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) {
- *has_null = true;
- dst->insert_many_defaults(*n);
+ dst->insert_many_defaults(n);
} else {
- *has_null = false;
- insert_default_data(_type_info.get(), _type_size, _mem_value, dst, *n);
+ insert_default_data(_type_info.get(), _type_size, _mem_value, dst, n);
}
-
- return Status::OK();
}
} // namespace segment_v2
diff --git a/be/src/olap/rowset/segment_v2/column_reader.h
b/be/src/olap/rowset/segment_v2/column_reader.h
index ed0303ca9b..4aa83ce888 100644
--- a/be/src/olap/rowset/segment_v2/column_reader.h
+++ b/be/src/olap/rowset/segment_v2/column_reader.h
@@ -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;
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index e685f26326..6a1fddf2dc 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -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
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.h
b/be/src/olap/rowset/segment_v2/segment_iterator.h
index fbf44c34da..682b9465dc 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.h
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.h
@@ -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,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]