Skip to content

Commit 6a71d96

Browse files
author
Chaithra Gopalareddy
committed
Merge branch 'mysql-8.0' into mysql-8.4
2 parents 80445db + 57b6d0d commit 6a71d96

File tree

4 files changed

+37
-29
lines changed

4 files changed

+37
-29
lines changed

sql/range_optimizer/index_range_scan.cc

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,18 @@ IndexRangeScanIterator::IndexRangeScanIterator(
6060
MEM_ROOT *return_mem_root, uint mrr_flags, uint mrr_buf_size,
6161
Bounds_checked_array<QUICK_RANGE *> ranges_arg)
6262
: RowIDCapableRowIterator(thd, table_arg),
63-
ranges(ranges_arg),
64-
free_file(false),
65-
cur_range(nullptr),
66-
last_range(nullptr),
67-
mrr_flags(mrr_flags),
68-
mrr_buf_size(mrr_buf_size),
69-
mrr_buf_desc(nullptr),
70-
need_rows_in_rowid_order(need_rows_in_rowid_order),
71-
reuse_handler(reuse_handler),
72-
mem_root(return_mem_root),
73-
m_expected_rows(expected_rows),
74-
m_examined_rows(examined_rows) {
63+
ranges{ranges_arg},
64+
free_file{false},
65+
cur_range{nullptr},
66+
last_range{nullptr},
67+
mrr_flags{mrr_flags},
68+
mrr_buf_size{mrr_buf_size},
69+
mrr_buf_desc{nullptr},
70+
need_rows_in_rowid_order{need_rows_in_rowid_order},
71+
reuse_handler{reuse_handler},
72+
mem_root{return_mem_root},
73+
m_expected_rows{expected_rows},
74+
m_examined_rows{examined_rows} {
7575
DBUG_TRACE;
7676

7777
in_ror_merged_scan = false;
@@ -233,11 +233,19 @@ bool IndexRangeScanIterator::Init() {
233233
// outside of the record. So don't request a buffer in this case, even
234234
// though the current read_set gives the impression that using a
235235
// record buffer would be fine.
236-
const bool skip_record_buffer =
237-
need_rows_in_rowid_order &&
238-
Overlaps(table()->file->ha_table_flags(),
239-
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) &&
240-
has_blob_primary_key(table());
236+
bool skip_record_buffer = need_rows_in_rowid_order &&
237+
Overlaps(table()->file->ha_table_flags(),
238+
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) &&
239+
has_blob_primary_key(table());
240+
// Skip the record buffer for covering multi-valued index range scans.
241+
// The current implementation of Field_typed_array::key_cmp() needs the
242+
// value of the generated column for the indexed expression, and this
243+
// column is not available in the multi-valued index, so the storage
244+
// engine cannot safely evaluate the end range condition when filling the
245+
// record buffer when it's a covering scan.
246+
skip_record_buffer |=
247+
Overlaps(table()->key_info[index].flags, HA_MULTI_VALUED_KEY) &&
248+
table()->key_read;
241249
if (!skip_record_buffer) {
242250
if (set_record_buffer(table(), m_expected_rows)) {
243251
return true; /* purecov: inspected */

sql/range_optimizer/index_range_scan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class IndexRangeScanIterator : public RowIDCapableRowIterator {
9999
private:
100100
MEM_ROOT *mem_root;
101101
bool inited = false;
102-
const bool m_expected_rows;
102+
const double m_expected_rows;
103103
ha_rows *m_examined_rows;
104104

105105
int cmp_next(QUICK_RANGE *range);

sql/range_optimizer/reverse_index_range_scan.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@
3434

3535
ReverseIndexRangeScanIterator::ReverseIndexRangeScanIterator(
3636
THD *thd, TABLE *table, ha_rows *examined_rows, double expected_rows,
37-
int index, MEM_ROOT *return_mem_root, uint mrr_flags,
37+
uint index, MEM_ROOT *return_mem_root, uint mrr_flags,
3838
Bounds_checked_array<QUICK_RANGE *> ranges, bool using_extended_key_parts)
3939
: TableRowIterator(thd, table),
40-
m_index(index),
41-
m_expected_rows(expected_rows),
42-
m_examined_rows(examined_rows),
43-
mem_root(return_mem_root),
44-
m_mrr_flags(mrr_flags),
45-
ranges(ranges),
46-
last_range(nullptr),
47-
m_using_extended_key_parts(using_extended_key_parts) {
40+
m_index{index},
41+
m_expected_rows{expected_rows},
42+
m_examined_rows{examined_rows},
43+
mem_root{return_mem_root},
44+
m_mrr_flags{mrr_flags},
45+
ranges{ranges},
46+
last_range{nullptr},
47+
m_using_extended_key_parts{using_extended_key_parts} {
4848
/*
4949
Use default MRR implementation for reverse scans. No table engine
5050
currently can do an MRR scan with output in reverse index order.

sql/range_optimizer/reverse_index_range_scan.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
class ReverseIndexRangeScanIterator : public TableRowIterator {
4343
public:
4444
ReverseIndexRangeScanIterator(THD *thd, TABLE *table, ha_rows *examined_rows,
45-
double expected_rows, int index,
45+
double expected_rows, uint index,
4646
MEM_ROOT *return_mem_root, uint mrr_flags,
4747
Bounds_checked_array<QUICK_RANGE *> ranges,
4848
bool using_extended_key_parts);
@@ -54,7 +54,7 @@ class ReverseIndexRangeScanIterator : public TableRowIterator {
5454
static range_seq_t quick_range_rev_seq_init(void *init_param, uint, uint);
5555

5656
const uint m_index; /* Index this quick select uses */
57-
ha_rows m_expected_rows;
57+
const double m_expected_rows;
5858
ha_rows *m_examined_rows;
5959

6060
MEM_ROOT *mem_root;

0 commit comments

Comments
 (0)