diff --git a/mysql-test/main/long_unique_bugs.result b/mysql-test/main/long_unique_bugs.result index d1f04d1e9fa..4ac056d8591 100644 --- a/mysql-test/main/long_unique_bugs.result +++ b/mysql-test/main/long_unique_bugs.result @@ -158,3 +158,16 @@ insert into t1 values(1,1); ERROR 23000: Duplicate entry '1-1' for key 'a' alter table t1 add column c int; drop table t1; +create table t1(a blob , b blob as (a) unique); +insert into t1 values(1, default); +insert into t1 values(1, default); +ERROR 23000: Duplicate entry '1' for key 'b' +drop table t1; +create table t1(a blob, b blob, c blob as (left(a, 5000)) virtual, d blob as (left(b, 5000)) persistent, unique(a,b(4000))); +insert into t1(a,b) values(10,11); +insert into t1(a,b) values(10,11); +ERROR 23000: Duplicate entry '10-11' for key 'a' +insert into t1(a,b) values(2,2); +insert into t1(a,b) values(2,3); +insert into t1(a,b) values(3,2); +drop table t1; diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index b8428e32017..7ae6401ccba 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -178,3 +178,21 @@ insert into t1 values(1,1); insert into t1 values(1,1); alter table t1 add column c int; drop table t1; + +# +# MDEV-18889 Long unique on virtual fields crashes server +# +create table t1(a blob , b blob as (a) unique); +insert into t1 values(1, default); +--error ER_DUP_ENTRY +insert into t1 values(1, default); +drop table t1; + +create table t1(a blob, b blob, c blob as (left(a, 5000)) virtual, d blob as (left(b, 5000)) persistent, unique(a,b(4000))); +insert into t1(a,b) values(10,11); +--error ER_DUP_ENTRY +insert into t1(a,b) values(10,11); +insert into t1(a,b) values(2,2); +insert into t1(a,b) values(2,3); +insert into t1(a,b) values(3,2); +drop table t1; diff --git a/sql/handler.cc b/sql/handler.cc index 0746f8a81fc..23df2c5b826 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -6547,7 +6547,8 @@ static int check_duplicate_long_entry_key(TABLE *table, handler *h, result= h->ha_index_init(key_no, 0); if (result) return result; - result= h->ha_index_read_map(table->check_unique_buf, + store_record(table, check_unique_buf); + result= h->ha_index_read_map(table->record[0], ptr, HA_WHOLE_KEY, HA_READ_KEY_EXACT); if (!result) { @@ -6583,7 +6584,7 @@ static int check_duplicate_long_entry_key(TABLE *table, handler *h, } } } - while (!is_same && !(result= h->ha_index_next_same(table->check_unique_buf, + while (!is_same && !(result= h->ha_index_next_same(table->record[0], ptr, key_info->key_length))); if (is_same) error= HA_ERR_FOUND_DUPP_KEY; @@ -6597,10 +6598,11 @@ exit: table->file->errkey= key_no; if (h->ha_table_flags() & HA_DUPLICATE_POS) { - h->position(table->check_unique_buf); + h->position(table->record[0]); memcpy(table->file->dup_ref, h->ref, h->ref_length); } } + restore_record(table, check_unique_buf); h->ha_index_end(); return error; }