Skip to content

Commit a97a3ff

Browse files
Manuel Ungfacebook-github-bot
authored andcommitted
Fix guess_rec_per_key to not calculate negative values
Summary: The function `guess_rec_per_key` tries to interpolate index cardinality by multiplying by (current keypart number) / (total keyparts). However, the denominator uses `key->user_defined_key_parts` which does not include extended key parts, while the current keypart being passed could be referencing extended keyparts. This means that the multiplicative factor could be > 1 which breaks some assumptions in this function. This bug mainly affects myrocks, since innodb never needs to guess `rec_per_key` as it is always populated in `::info`. Reviewed By: luqun Differential Revision: D43013207 fbshipit-source-id: 9060eaa
1 parent e428b37 commit a97a3ff

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

sql/opt_statistics.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,11 @@ rec_per_key_t guess_rec_per_key(const TABLE *const table, const KEY *const key,
101101
if (key->user_defined_key_parts > 1) {
102102
// See formula above
103103
rec_per_key =
104-
rec_per_key_first - (rec_per_key_t(used_keyparts - 1) /
105-
(key->user_defined_key_parts - 1)) *
106-
(rec_per_key_first - rec_per_key_all);
104+
rec_per_key_first -
105+
(rec_per_key_t(std::min(used_keyparts, key->user_defined_key_parts) -
106+
1) /
107+
(key->user_defined_key_parts - 1)) *
108+
(rec_per_key_first - rec_per_key_all);
107109
} else {
108110
// Single column index
109111
if (key->actual_flags & HA_NOSAME)

0 commit comments

Comments
 (0)