From 58230ae8db8e49e01789d87652cc4704e3752c0e Mon Sep 17 00:00:00 2001 From: XIAO-HOU <372060054@qq.com> Date: Wed, 10 Apr 2024 09:15:38 +0000 Subject: [PATCH] Fix build range bug after refresh table --- .../access/ob_multiple_multi_scan_merge.cpp | 2 +- src/storage/access/ob_table_scan_iterator.cpp | 19 +++++++++++++++++++ src/storage/access/ob_table_scan_iterator.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/storage/access/ob_multiple_multi_scan_merge.cpp b/src/storage/access/ob_multiple_multi_scan_merge.cpp index dfefe7309..fa18f1d11 100644 --- a/src/storage/access/ob_multiple_multi_scan_merge.cpp +++ b/src/storage/access/ob_multiple_multi_scan_merge.cpp @@ -111,7 +111,7 @@ int ObMultipleMultiScanMerge::calc_scan_range() const ObDatumRowkey &range_key = is_reverse_scan ? range.get_start_key() : range.get_end_key(); if (OB_FAIL(range_key.compare(curr_rowkey_, read_info->get_datum_utils(), cmp_ret))) { STORAGE_LOG(WARN, "Failed to cmopare range key ", K(ret), K(range_key), K(curr_rowkey_)); - } else if (cmp_ret > 0) { + } else if ((is_reverse_scan && cmp_ret < 0) || (!is_reverse_scan && cmp_ret > 0)) { range.change_boundary(curr_rowkey_, is_reverse_scan); range_idx_delta_ += i; if (OB_FAIL(cow_ranges_.push_back(range))) { diff --git a/src/storage/access/ob_table_scan_iterator.cpp b/src/storage/access/ob_table_scan_iterator.cpp index 71beb3e8b..1c6227bbc 100644 --- a/src/storage/access/ob_table_scan_iterator.cpp +++ b/src/storage/access/ob_table_scan_iterator.cpp @@ -532,6 +532,23 @@ int ObTableScanIterator::init_and_open_get_merge_iter_() return ret; } +int ObTableScanIterator::sort_sample_ranges() +{ + int ret = OB_SUCCESS; + const ObStorageDatumUtils &datum_utils = scan_param_->table_param_->get_read_info().get_datum_utils(); + if (OB_UNLIKELY(!datum_utils.is_valid())) { + ret = OB_ERR_UNEXPECTED; + STORAGE_LOG(WARN, "Unexpected error for invalid datum utils", K(ret), KPC(scan_param_->table_param_)); + } else if (sample_ranges_.count() > 1 && scan_param_->scan_flag_.is_ordered_scan()) { + ObDatumComparor comparor(datum_utils, ret, scan_param_->scan_flag_.is_reverse_scan()); + std::sort(sample_ranges_.begin(), sample_ranges_.end(), comparor); + if (OB_FAIL(ret)) { + STORAGE_LOG(WARN, "Failed to sort datum ranges", K(ret), K_(sample_ranges)); + } + } + return ret; +} + int ObTableScanIterator::init_and_open_scan_merge_iter_() { int ret = OB_SUCCESS; @@ -543,6 +560,8 @@ int ObTableScanIterator::init_and_open_scan_merge_iter_() ObGetSampleIterHelper sample_iter_helper(table_scan_range_, main_table_ctx_, *scan_param_, get_table_param_); if (OB_FAIL(sample_iter_helper.check_scan_range_count(need_scan_multiple_range, sample_ranges_))) { STORAGE_LOG(WARN, "check scan range count failed", KR(ret), KPC(scan_param_)); + } else if (OB_FAIL(sort_sample_ranges())) { + STORAGE_LOG(WARN, "failed to sort sample ranges", K(ret)); } else if (need_scan_multiple_range) { // this branch means the sample is row(memtable row) sample if (!scan_param_->sample_info_.is_row_sample()) { diff --git a/src/storage/access/ob_table_scan_iterator.h b/src/storage/access/ob_table_scan_iterator.h index 3e851ed95..01c18aea4 100644 --- a/src/storage/access/ob_table_scan_iterator.h +++ b/src/storage/access/ob_table_scan_iterator.h @@ -96,6 +96,7 @@ private: int init_and_open_block_sample_iter_(); int init_and_open_row_sample_iter_(); int init_and_open_memtable_row_sample_iter_(const ObIArray &scan_ranges); + int sort_sample_ranges(); private: bool is_inited_;