1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +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

@ -45,3 +45,27 @@ SELECT STRAIGHT_JOIN g.id FROM t2 a, t3 g USE INDEX(groups_dt)
WHERE g.domain = 'queue' AND g.type = a.type;
drop table t0,t1,t2,t3;
--echo #
--echo # MDEV-35253: xa_prepare_unlock_unmodified fails: shift exponent 32 is too large
--echo #
--source include/have_sequence.inc
set @create=
concat("create table t1(",
(select group_concat(concat("col",seq, " int")) from seq_1_to_32),
",\n index idx1(",
(select group_concat(concat("col",seq)) from seq_1_to_32),
")\n)"
);
let $create_tbl=`select @create`;
evalp $create_tbl;
insert into t1() values (),(),();
analyze table t1;
--echo # Must not produce a "shift exponent 32 is too large" runtime ubsan error
explain select * from t1 where col1=1;
drop table t1;
--echo End of 10.5 tests