diff options
author | unknown <ingo@mysql.com> | 2004-10-21 22:17:10 +0200 |
---|---|---|
committer | unknown <ingo@mysql.com> | 2004-10-21 22:17:10 +0200 |
commit | 5ce9e597e51625a7f586e79d77d0a0e14910e1aa (patch) | |
tree | 7ecd7de9138efd9d3f153d4f6c38a805760f0d06 | |
parent | 6d3e14a1c62f920674214becd8278ab51bf83911 (diff) | |
download | mariadb-git-5ce9e597e51625a7f586e79d77d0a0e14910e1aa.tar.gz |
BUG#6151 - myisam index corruption.
Removed the assumption of a certain key order.
Since 4.1, keys are padded with blanks for comparison.
Hence, shorter keys sort behind longer keys, if the
data bytes have values below BLANK.
mysql-test/r/key.result:
BUG#6151 - myisam index corruption.
The test results.
mysql-test/t/key.test:
BUG#6151 - myisam index corruption.
Added the test case as derived from the original data.
-rw-r--r-- | myisam/mi_delete.c | 4 | ||||
-rw-r--r-- | mysql-test/r/key.result | 23 | ||||
-rw-r--r-- | mysql-test/t/key.test | 19 |
3 files changed, 44 insertions, 2 deletions
diff --git a/myisam/mi_delete.c b/myisam/mi_delete.c index 3e8ff9db009..093a94bbf27 100644 --- a/myisam/mi_delete.c +++ b/myisam/mi_delete.c @@ -826,8 +826,8 @@ static uint remove_key(MI_KEYDEF *keyinfo, uint nod_flag, else get_key_length(rest_length,keypos); - if (next_length > prev_length) - { /* Key after is based on deleted key */ + /* Key after is based on deleted key */ + { uint pack_length,tmp; bmove_upp((char*) keypos,(char*) (lastkey+next_length), tmp=(next_length-prev_length)); diff --git a/mysql-test/r/key.result b/mysql-test/r/key.result index 967ff47e1ea..e076c59a76c 100644 --- a/mysql-test/r/key.result +++ b/mysql-test/r/key.result @@ -267,3 +267,26 @@ select t from t1 where t=0xD0B1D0B1212223D0B1D0B1D0B1D0B1; t ??!"#???? drop table t1; +DROP TABLE IF EXISTS t1; +Warnings: +Note 1051 Unknown table 't1' +CREATE TABLE t1 ( +c1 int, +c2 varbinary(240), +UNIQUE KEY (c1), +KEY (c2) +) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,'\Z\Z\Z\Z'); +INSERT INTO t1 VALUES (2,'\Z\Z\Z\Z\Z\Z'); +INSERT INTO t1 VALUES (3,'\Z\Z\Z\Z'); +select c1 from t1 where c2='\Z\Z\Z\Z'; +c1 +1 +3 +DELETE FROM t1 WHERE (c1 = 1); +select c1 from t1 where c2='\Z\Z\Z\Z'; +c1 +3 +DELETE FROM t1 WHERE (c1 = 3); +select c1 from t1 where c2='\Z\Z\Z\Z'; +c1 diff --git a/mysql-test/t/key.test b/mysql-test/t/key.test index ce10f07cf07..5c365ccf965 100644 --- a/mysql-test/t/key.test +++ b/mysql-test/t/key.test @@ -252,3 +252,22 @@ select c from t1 where c=0xD0B1212223D0B1D0B1D0B1D0B1D0B1; select t from t1 where t=0xD0B1D0B1212223D0B1D0B1D0B1D0B1; drop table t1; +# +# BUG#6151 - myisam index corruption +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( + c1 int, + c2 varbinary(240), + UNIQUE KEY (c1), + KEY (c2) +) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,'\Z\Z\Z\Z'); +INSERT INTO t1 VALUES (2,'\Z\Z\Z\Z\Z\Z'); +INSERT INTO t1 VALUES (3,'\Z\Z\Z\Z'); +select c1 from t1 where c2='\Z\Z\Z\Z'; +DELETE FROM t1 WHERE (c1 = 1); +select c1 from t1 where c2='\Z\Z\Z\Z'; +DELETE FROM t1 WHERE (c1 = 3); +select c1 from t1 where c2='\Z\Z\Z\Z'; + |