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

MDEV-35253: xa_prepare_unlock_unmodified fails: shift exponent 32 is too large

The code in best_access_path() uses PREV_BITS(uint, N) to
compute a bitmap of all keyparts: {keypart0, ... keypart{N-1}).

The problem is that PREV_BITS($type, N) macro code can't handle the case
when N=<number of bits in $type).
Also, why use PREV_BITS(uint, ...) for key part map computations when
we could have used PREV_BITS(key_part_map) ?

Fixed both:
- Change PREV_BITS(type, N) to handle any N in [0; n_bits(type)].
- Change PREV_BITS() to use key_part_map when computing key_part_map bitmaps.
This commit is contained in:
Sergei Petrunia
2024-10-25 15:33:57 +03:00
parent b8c2bd9f69
commit 284593413f
6 changed files with 63 additions and 5 deletions

View File

@ -2598,4 +2598,15 @@ void propagate_new_equalities(THD *thd, Item *cond,
COND_EQUAL *inherited,
bool *is_simplifiable_cond);
template<typename T> T prev_bits(T n_bits)
{
if (!n_bits)
return 0;
T tmp= ((T)1 << (n_bits - 1));
return (tmp - 1) | tmp;
}
// A wrapper for the above function:
#define PREV_BITS(type, A) prev_bits<type>(A)
#endif /* SQL_SELECT_INCLUDED */