From 9ea02a1c094594692469e79a519b649ec3b8e487 Mon Sep 17 00:00:00 2001 From: Thirunarayanan B Date: Mon, 17 Feb 2014 13:45:34 +0530 Subject: [PATCH] Bug #18010711 UNIQUE PREFIX INDEX ON BINARY COLUMN: FAILING ASSERTION: FLEN == LEN Problem: Broken invariant triggered when building a unique index on a binary column and the input data contains duplicate keys. This was broken in debug builds only. Fix: Fixed length of the binary datatype can be greater than length of the shorter prefix on which index is being created. --- mysql-test/suite/innodb/r/create-index.result | 9 +++++++++ mysql-test/suite/innodb/t/create-index.test | 11 +++++++++++ storage/innobase/handler/handler0alter.cc | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 mysql-test/suite/innodb/r/create-index.result create mode 100644 mysql-test/suite/innodb/t/create-index.test diff --git a/mysql-test/suite/innodb/r/create-index.result b/mysql-test/suite/innodb/r/create-index.result new file mode 100644 index 00000000000..ad358a86329 --- /dev/null +++ b/mysql-test/suite/innodb/r/create-index.result @@ -0,0 +1,9 @@ +# +# Bug #18010711 UNIQUE PREFIX INDEX ON BINARY COLUMN: FAILING +# ASSERTION: FLEN == LEN +# +create table t1 (f1 binary(5)) engine=innodb; +insert into t1 values ('w'), ('w'); +create unique index index_t1 on t1(f1(4)); +ERROR 23000: Duplicate entry 'w' for key 'index_t1' +drop table t1; diff --git a/mysql-test/suite/innodb/t/create-index.test b/mysql-test/suite/innodb/t/create-index.test new file mode 100644 index 00000000000..e1e5b856aca --- /dev/null +++ b/mysql-test/suite/innodb/t/create-index.test @@ -0,0 +1,11 @@ +--source include/have_innodb.inc + +--echo # +--echo # Bug #18010711 UNIQUE PREFIX INDEX ON BINARY COLUMN: FAILING +--echo # ASSERTION: FLEN == LEN +--echo # +create table t1 (f1 binary(5)) engine=innodb; +insert into t1 values ('w'), ('w'); +--error ER_DUP_ENTRY +create unique index index_t1 on t1(f1(4)); +drop table t1; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index e4697319309..005f14a6f23 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -110,16 +110,16 @@ innobase_col_to_mysql( /* These column types should never be shipped to MySQL. */ ut_ad(0); - case DATA_FIXBINARY: case DATA_FLOAT: case DATA_DOUBLE: case DATA_DECIMAL: /* Above are the valid column types for MySQL data. */ ut_ad(flen == len); /* fall through */ + case DATA_FIXBINARY: case DATA_CHAR: /* We may have flen > len when there is a shorter - prefix on a CHAR column. */ + prefix on the CHAR and BINARY column. */ ut_ad(flen >= len); #else /* UNIV_DEBUG */ default: