diff --git a/mysql-test/r/errors.result b/mysql-test/r/errors.result index a3a8fe0b147..3d247a242a3 100644 --- a/mysql-test/r/errors.result +++ b/mysql-test/r/errors.result @@ -120,3 +120,17 @@ SET sql_quote_show_create= _utf8 x'5452C39C45'; ERROR 42000: Variable 'sql_quote_show_create' can't be set to the value of 'TRÜE' SET sql_quote_show_create=_latin1 x'5452DC45'; ERROR 42000: Variable 'sql_quote_show_create' can't be set to the value of 'TRÜE' +# +# Bug#52430 Incorrect key in the error message for duplicate key error involving BINARY type +# +CREATE TABLE t1(c1 BINARY(10), c2 BINARY(10), c3 BINARY(10), +PRIMARY KEY(c1,c2,c3)); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +ERROR 23000: Duplicate entry 'abc-abc-abc' for key 'PRIMARY' +DROP TABLE t1; +CREATE TABLE t1 (f1 VARBINARY(19) PRIMARY KEY); +INSERT INTO t1 VALUES ('abc\0\0'); +INSERT INTO t1 VALUES ('abc\0\0'); +ERROR 23000: Duplicate entry 'abc\x00\x00' for key 'PRIMARY' +DROP TABLE t1; diff --git a/mysql-test/r/type_binary.result b/mysql-test/r/type_binary.result index 01841bf27fc..b00d1585b29 100644 --- a/mysql-test/r/type_binary.result +++ b/mysql-test/r/type_binary.result @@ -47,7 +47,7 @@ create table t1 (s1 binary(2) primary key); insert into t1 values (0x01); insert into t1 values (0x0120); insert into t1 values (0x0100); -ERROR 23000: Duplicate entry '\x01\x00' for key 'PRIMARY' +ERROR 23000: Duplicate entry '\x01' for key 'PRIMARY' select hex(s1) from t1 order by s1; hex(s1) 0100 diff --git a/mysql-test/t/errors.test b/mysql-test/t/errors.test index 5e53eaf0a52..f308c340645 100644 --- a/mysql-test/t/errors.test +++ b/mysql-test/t/errors.test @@ -140,3 +140,18 @@ SET sql_quote_show_create= _utf8 x'5452C39C45'; --error ER_WRONG_VALUE_FOR_VAR SET sql_quote_show_create=_latin1 x'5452DC45'; +--echo # +--echo # Bug#52430 Incorrect key in the error message for duplicate key error involving BINARY type +--echo # +CREATE TABLE t1(c1 BINARY(10), c2 BINARY(10), c3 BINARY(10), +PRIMARY KEY(c1,c2,c3)); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +DROP TABLE t1; + +CREATE TABLE t1 (f1 VARBINARY(19) PRIMARY KEY); +INSERT INTO t1 VALUES ('abc\0\0'); +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES ('abc\0\0'); +DROP TABLE t1; diff --git a/sql/key.cc b/sql/key.cc index d593850ca10..582334620ad 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -354,6 +354,16 @@ void key_unpack(String *to,TABLE *table,uint idx) { CHARSET_INFO *cs= field->charset(); field->val_str(&tmp); + /* + For BINARY(N) strip trailing zeroes to make + the error message nice-looking + */ + if (field->binary() && field->type() == MYSQL_TYPE_STRING && tmp.length()) + { + const char *tmp_end= tmp.ptr() + tmp.length(); + while (tmp_end > tmp.ptr() && !*--tmp_end); + tmp.length(tmp_end - tmp.ptr() + 1); + } if (cs->mbmaxlen > 1 && table->field[key_part->fieldnr - 1]->field_length != key_part->length)