mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
Fix for BUG#41541 - Valgrind warnings on packed MyISAM table
After the table is compressed by the myisampack utility, opening the table by the server produces valgrind warnings. This happens because when we try to read a record into the buffer we alway assume that the remaining buffer to read is always equal to word size(4 or 8 or 2 bytes) we read. Sometimes we have remaining buffer size less than word size and trying to read the entire word size will end up in valgrind errors. Fixed by reading byte by byte when we detect the remaining buffer size is less than the word size.
This commit is contained in:
parent
8aff42f6a0
commit
7b1d72a096
3 changed files with 56 additions and 0 deletions
|
@ -1430,6 +1430,32 @@ static void fill_buffer(MI_BIT_BUFF *bit_buff)
|
|||
bit_buff->current_byte=0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint len= 0;
|
||||
uint i= 0;
|
||||
/*
|
||||
Check if the remaining buffer/record to read is less than the word size.
|
||||
If so read byte by byte
|
||||
|
||||
Note: if this branch becomes a bottleneck it can be removed, assuming
|
||||
that the second memory segment allocates 7 extra bytes (see
|
||||
_mi_read_pack_info()).
|
||||
*/
|
||||
len= bit_buff->end - bit_buff->pos;
|
||||
if (len < (BITS_SAVED / 8))
|
||||
{
|
||||
bit_buff->current_byte= 0;
|
||||
for (i=0 ; i < len ; i++)
|
||||
{
|
||||
bit_buff->current_byte+= (((uint) ((uchar) bit_buff->pos[len - i - 1]))
|
||||
<< (8 * i));
|
||||
}
|
||||
bit_buff->pos= bit_buff->end;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#if BITS_SAVED == 64
|
||||
bit_buff->current_byte= ((((uint) ((uchar) bit_buff->pos[7]))) +
|
||||
(((uint) ((uchar) bit_buff->pos[6])) << 8) +
|
||||
|
|
|
@ -27,3 +27,14 @@ CHECK TABLE t1 EXTENDED;
|
|||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#41541 - Valgrind warnings on packed MyISAM table
|
||||
#
|
||||
CREATE TABLE t1(f1 VARCHAR(200), f2 TEXT);
|
||||
INSERT INTO t1 VALUES ('foo', 'foo1'), ('bar', 'bar1');
|
||||
FLUSH TABLE t1;
|
||||
# Compress the table using MYISAMPACK tool
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
1024
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -31,3 +31,22 @@ FLUSH TABLES;
|
|||
--exec $MYISAMCHK -s --unpack $MYSQLTEST_VARDIR/master-data/test/t1
|
||||
CHECK TABLE t1 EXTENDED;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#41541 - Valgrind warnings on packed MyISAM table
|
||||
--echo #
|
||||
CREATE TABLE t1(f1 VARCHAR(200), f2 TEXT);
|
||||
INSERT INTO t1 VALUES ('foo', 'foo1'), ('bar', 'bar1');
|
||||
let $i=9;
|
||||
--disable_query_log
|
||||
while ($i)
|
||||
{
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
dec $i;
|
||||
}
|
||||
--enable_query_log
|
||||
FLUSH TABLE t1;
|
||||
--echo # Compress the table using MYISAMPACK tool
|
||||
--exec $MYISAMPACK $MYSQLTEST_VARDIR/master-data/test/t1
|
||||
SELECT COUNT(*) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
|
Loading…
Reference in a new issue