Skip to content

MDEV-41252: partial join cost Assertion failure in recompute_join_cost_with_limit() - #5802

Open
bsrikanth-mariadb wants to merge 1 commit into
11.4from
11.4-MDEV-41252-partial_join_cost_assertion_failure
Open

bsrikanth-mariadb wants to merge 1 commit into
11.4from
11.4-MDEV-41252-partial_join_cost_assertion_failure

Conversation

@bsrikanth-mariadb

Copy link
Copy Markdown
Contributor

recompute_join_cost_with_limit() computes the cost of the first table's partial join as best_readfraction - pos->read_timefraction. When the two costs are nearly equal and large (e.g. with a huge optimizer_scan_setup_cost, or when fraction is close to 1), the two products are rounded independently. The difference can then be a small negative number whose magnitude exceeds the absolute DBL_EPSILON tolerance used by the debug assertion, even though it is only a floating-point rounding artifact.

Fix: scale the assertion tolerance with the magnitude of the operands (DBL_EPSILON * pos->read_time * fraction). Negative values are still clamped to 0.0 as before.

Add test cases to optimizer_crash.test, one with a very large optimizer_scan_setup_cost and optimizer_join_limit_pref_ratio=1, and one with a large LIMIT on a 30000-row table.

…t_with_limit()

recompute_join_cost_with_limit() computes the cost of the first table's
partial join as best_read*fraction - pos->read_time*fraction. When the
two costs are nearly equal and large (e.g. with a huge
optimizer_scan_setup_cost, or when fraction is close to 1), the two
products are rounded independently. The difference can then be a small
negative number whose magnitude exceeds the absolute DBL_EPSILON
tolerance used by the debug assertion, even though it is only a
floating-point rounding artifact.

Fix: scale the assertion tolerance with the magnitude of the operands
(DBL_EPSILON * pos->read_time * fraction). Negative values are still
clamped to 0.0 as before.

Add test cases to optimizer_crash.test, one with a very large
optimizer_scan_setup_cost and optimizer_join_limit_pref_ratio=1, and one
with a large LIMIT on a 30000-row table.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

1 participant