1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-22401: Optimizer trace: multi-component range is not printed correctly

KEY_MULTI_RANGE::range_flag does not have correct flag bits for
per-endpoint flags (NEAR_MIN, NEAR_MAX, NO_MIN_RANGE, NO_MAX_RANGE).
It only has bits for flags that describe both endpoints.
So
- Document this.
- Switch optimizer trace to using {start|end}_key.flag values, instead.
  This fixes the bug.
- Switch records_in_column_ranges() to doing that too. (This used to
  work, because KEY_MULTI_RANGE::range_flag had correct flag value
  for the last key component, and EITS only uses one-component
  pseudo-indexes)
This commit is contained in:
Sergei Petrunia
2020-04-29 01:13:52 +03:00
parent 5ba2aa1ddc
commit 7bc6735736
5 changed files with 74 additions and 10 deletions

View File

@ -3206,8 +3206,18 @@ double records_in_column_ranges(PARAM *param, uint idx,
key_range *min_endp, *max_endp;
min_endp= range.start_key.length? &range.start_key : NULL;
max_endp= range.end_key.length? &range.end_key : NULL;
rows= get_column_range_cardinality(field, min_endp, max_endp,
range.range_flag);
int range_flag= range.range_flag;
if (!range.start_key.length)
range_flag |= NO_MIN_RANGE;
if (!range.end_key.length)
range_flag |= NO_MAX_RANGE;
if (range.start_key.flag == HA_READ_AFTER_KEY)
range_flag |= NEAR_MIN;
if (range.start_key.flag == HA_READ_BEFORE_KEY)
range_flag |= NEAR_MAX;
rows= get_column_range_cardinality(field, min_endp, max_endp, range_flag);
if (DBL_MAX == rows)
{
total_rows= DBL_MAX;
@ -15814,24 +15824,29 @@ void print_range(String *out, const KEY_PART_INFO *key_part,
return;
}
if (!(flag & NO_MIN_RANGE))
if (range->start_key.length)
{
print_key_value(out, key_part, range->start_key.key,
range->start_key.length);
if (flag & NEAR_MIN)
if (range->start_key.flag == HA_READ_AFTER_KEY)
out->append(STRING_WITH_LEN(" < "));
else
else if (range->start_key.flag == HA_READ_KEY_EXACT ||
range->start_key.flag == HA_READ_KEY_OR_NEXT)
out->append(STRING_WITH_LEN(" <= "));
else
out->append(STRING_WITH_LEN(" ? "));
}
print_keyparts_name(out, key_part, n_key_parts, keypart_map);
if (!(flag & NO_MAX_RANGE))
if (range->end_key.length)
{
if (flag & NEAR_MAX)
if (range->end_key.flag == HA_READ_BEFORE_KEY)
out->append(STRING_WITH_LEN(" < "));
else
else if (range->end_key.flag == HA_READ_AFTER_KEY)
out->append(STRING_WITH_LEN(" <= "));
else
out->append(STRING_WITH_LEN(" ? "));
print_key_value(out, key_part, range->end_key.key,
range->end_key.length);
}