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:
@ -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 */
|
||||
|
Reference in New Issue
Block a user