From: Date: March 10 2009 11:04am Subject: bzr commit into mysql-5.1-bugteam branch (satya.bn:2820) Bug#32880 List-Archive: http://lists.mysql.com/commits/68745 X-Bug: 32880 Message-Id: <0KGA003B6BZB1XG0@mail-apac.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7BIT #At file:///home/satya/WORK/mysql-5.1-bugteam-32880/ based on revid:davi.arnaut@stripped 2820 Satya B 2009-03-10 Fix for BUG#32880 - Repairing Archive table fails with internal error 144 Repairing Archive table fails as the row read from the corrupted archive table is not equal the length at the time of insert. Any statement reading corrupt archive data file (CHECK/REPAIR/SELECT/UPDATE/DELETE) may cause assertion failure in debug builds. This assertion has been removed and an error is returned instead. Also fixed that CHECK/REPAIR returns vague error message when it mets corruption in archive data file. This is fixed by returning proper error code. added: mysql-test/std_data/bug32880.ARN mysql-test/std_data/bug32880.ARZ mysql-test/std_data/bug32880.frm modified: mysql-test/r/archive.result mysql-test/t/archive.test storage/archive/ha_archive.cc per-file messages: mysql-test/r/archive.result A test case for BUG#32880 mysql-test/std_data/bug32880.ARN corrupted archive table to test check and repair table operation mysql-test/std_data/bug32880.ARZ corrupted archive table to test check and repair table operation mysql-test/std_data/bug32880.frm corrupted archive table to test check and repair table operation mysql-test/t/archive.test A test case for BUG#32880 storage/archive/ha_archive.cc Fixed unpack_row() to return the error instead of throwing assertion and also fixed repair() to throw better error when repair table peration fails on corrupted archive table === modified file 'mysql-test/r/archive.result' --- a/mysql-test/r/archive.result 2008-03-14 16:59:03 +0000 +++ b/mysql-test/r/archive.result 2009-03-10 10:04:19 +0000 @@ -12695,3 +12695,16 @@ a b 1 NULL 2 NULL DROP TABLE t1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` blob +) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check error Corrupt +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair error Corrupt +DROP TABLE t1; === added file 'mysql-test/std_data/bug32880.ARN' Binary files a/mysql-test/std_data/bug32880.ARN 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug32880.ARN 2009-03-10 10:04:19 +0000 differ === added file 'mysql-test/std_data/bug32880.ARZ' Binary files a/mysql-test/std_data/bug32880.ARZ 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug32880.ARZ 2009-03-10 10:04:19 +0000 differ === added file 'mysql-test/std_data/bug32880.frm' Binary files a/mysql-test/std_data/bug32880.frm 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug32880.frm 2009-03-10 10:04:19 +0000 differ === modified file 'mysql-test/t/archive.test' --- a/mysql-test/t/archive.test 2008-03-14 16:59:03 +0000 +++ b/mysql-test/t/archive.test 2009-03-10 10:04:19 +0000 @@ -1599,3 +1599,17 @@ INSERT INTO t1 VALUES (NULL, NULL),(NULL FLUSH TABLE t1; SELECT * FROM t1 ORDER BY a; DROP TABLE t1; + +# +# BUG#32880 - Repairing Archive table fails with internal error 144 +# + +# Test with an existing table which is corrupted +let $MYSQLD_DATADIR= `select @@datadir`; +copy_file std_data/bug32880.frm $MYSQLD_DATADIR/test/t1.frm; +copy_file std_data/bug32880.ARZ $MYSQLD_DATADIR/test/t1.ARZ; +copy_file std_data/bug32880.ARN $MYSQLD_DATADIR/test/t1.ARN; +SHOW CREATE TABLE t1; +CHECK TABLE t1; +REPAIR TABLE t1; +DROP TABLE t1; === modified file 'storage/archive/ha_archive.cc' --- a/storage/archive/ha_archive.cc 2008-10-03 18:08:40 +0000 +++ b/storage/archive/ha_archive.cc 2009-03-10 10:04:19 +0000 @@ -1076,11 +1076,9 @@ int ha_archive::unpack_row(azio_stream * read= azread(file_to_read, record_buffer->buffer, row_len, &error); - DBUG_ASSERT(row_len == read); - if (read != row_len || error) { - DBUG_RETURN(-1); + DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE); } /* Copy null bits */ @@ -1257,7 +1255,7 @@ int ha_archive::repair(THD* thd, HA_CHEC int rc= optimize(thd, check_opt); if (rc) - DBUG_RETURN(HA_ERR_CRASHED_ON_REPAIR); + DBUG_RETURN(HA_ADMIN_CORRUPT); share->crashed= FALSE; DBUG_RETURN(0);