diff options
author | Michael Widenius <monty@askmonty.org> | 2010-12-21 19:22:20 +0200 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2010-12-21 19:22:20 +0200 |
commit | 865685dc0c0d7dec7415b82bf93ad63ca26cbacc (patch) | |
tree | d7725926405794542321f26aa0cbc3d5e1815ca1 | |
parent | 0b20943e9d7e22332ccc14b30b49a78a780cc23d (diff) | |
download | mariadb-git-865685dc0c0d7dec7415b82bf93ad63ca26cbacc.tar.gz |
Fixed bug in Aria that caused REPAIR to find old deleted rows.
BUILD/compile-pentium64:
Added --with-zlib-dir=bundled when doing static build.
mysql-test/suite/maria/r/maria.result:
Added test case
mysql-test/suite/maria/t/maria.test:
Added test case
storage/maria/ma_blockrec.c:
We need to flush blob pages to disk to ensure they overwrite any reused head/tail pages.
If not, REPAIR will find rows that was previously deleted.
-rwxr-xr-x | BUILD/compile-pentium64 | 5 | ||||
-rw-r--r-- | mysql-test/suite/maria/r/maria.result | 16 | ||||
-rw-r--r-- | mysql-test/suite/maria/t/maria.test | 18 | ||||
-rw-r--r-- | storage/maria/ma_blockrec.c | 2 |
4 files changed, 39 insertions, 2 deletions
diff --git a/BUILD/compile-pentium64 b/BUILD/compile-pentium64 index 3a8fad51fea..01eb2adf88b 100755 --- a/BUILD/compile-pentium64 +++ b/BUILD/compile-pentium64 @@ -4,7 +4,10 @@ path=`dirname $0` . "$path/SETUP.sh" extra_flags="$pentium64_cflags $fast_cflags" -extra_configs="$pentium_configs $static_link" +# On CentOS/Fedora Core 10 amd64, there is system libz.so but not +# libz.a, so need to use bundled zlib when building static +# binary. Hence we use --with-zlib-dir=bundled +extra_configs="$pentium_configs $static_link --with-zlib-dir=bundled" CC="$CC --pipe" strip=yes diff --git a/mysql-test/suite/maria/r/maria.result b/mysql-test/suite/maria/r/maria.result index 46ae485b678..9f34f60ca24 100644 --- a/mysql-test/suite/maria/r/maria.result +++ b/mysql-test/suite/maria/r/maria.result @@ -2624,3 +2624,19 @@ KEY (v3) INSERT INTO t1 ( f1 , f2 , f3 , f4 ) SELECT f1 , f4 , f1 , f4 FROM t1; DELETE FROM t1; drop table t1; +create table t1 (a int not null primary key, b blob) engine=maria transactional=1; +insert into t1 values(1,repeat('a',8000)); +insert into t1 values(2,repeat('b',8000)); +insert into t1 values(3,repeat('c',8000)); +flush tables; +delete from t1 where a>1; +insert into t1 values(1,repeat('d',8000*3)); +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +flush tables; +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +repair table t1 extended; +Table Op Msg_type Msg_text +test.t1 repair status OK +drop table t1; diff --git a/mysql-test/suite/maria/t/maria.test b/mysql-test/suite/maria/t/maria.test index 4dde6364bb1..fe2bd43988e 100644 --- a/mysql-test/suite/maria/t/maria.test +++ b/mysql-test/suite/maria/t/maria.test @@ -1911,6 +1911,24 @@ DELETE FROM t1; drop table t1; # +# Test of problem where REPAIR finds old deleted rows. +# + +create table t1 (a int not null primary key, b blob) engine=maria transactional=1; +insert into t1 values(1,repeat('a',8000)); +insert into t1 values(2,repeat('b',8000)); +insert into t1 values(3,repeat('c',8000)); +flush tables; +delete from t1 where a>1; +--error 1062 +insert into t1 values(1,repeat('d',8000*3)); +flush tables; +check table t1; +# This failed by finding 2 extra rows. +repair table t1 extended; +drop table t1; + +# # End of test # # Set defaults back diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index fd02e2ac0ec..2c3ff43c6ec 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -2506,7 +2506,7 @@ static my_bool free_full_page_range(MARIA_HA *info, pgcache_page_no_t page, } if (delete_count && pagecache_delete_pages(share->pagecache, &info->dfile, - page, delete_count, PAGECACHE_LOCK_WRITE, 0)) + page, delete_count, PAGECACHE_LOCK_WRITE, 1)) res= 1; if (share->now_transactional) |