summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ingo@mysql.com>2004-10-21 22:17:10 +0200
committerunknown <ingo@mysql.com>2004-10-21 22:17:10 +0200
commit5ce9e597e51625a7f586e79d77d0a0e14910e1aa (patch)
tree7ecd7de9138efd9d3f153d4f6c38a805760f0d06
parent6d3e14a1c62f920674214becd8278ab51bf83911 (diff)
downloadmariadb-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.c4
-rw-r--r--mysql-test/r/key.result23
-rw-r--r--mysql-test/t/key.test19
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';
+