summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--myisam/mi_packrec.c26
-rw-r--r--mysql-test/r/myisampack.result11
-rw-r--r--mysql-test/t/myisampack.test19
3 files changed, 56 insertions, 0 deletions
diff --git a/myisam/mi_packrec.c b/myisam/mi_packrec.c
index ddcf0f33e61..df9a4d18a6c 100644
--- a/myisam/mi_packrec.c
+++ b/myisam/mi_packrec.c
@@ -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) +
diff --git a/mysql-test/r/myisampack.result b/mysql-test/r/myisampack.result
index 5f39d318234..b4b200549a5 100644
--- a/mysql-test/r/myisampack.result
+++ b/mysql-test/r/myisampack.result
@@ -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;
diff --git a/mysql-test/t/myisampack.test b/mysql-test/t/myisampack.test
index 6598af6318a..ace7afce88a 100644
--- a/mysql-test/t/myisampack.test
+++ b/mysql-test/t/myisampack.test
@@ -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;