From 87609324e0eeb8f00810604e570a3b2b0b45d1a4 Mon Sep 17 00:00:00 2001 From: Ming Lin Date: Sat, 4 Aug 2018 22:57:52 -0700 Subject: [PATCH] MDEV-16768: fix blob key length The blob key length could be shorter than the length of the entire blob, for example, CREATE TABLE t1 (b BLOB, i INT, KEY(b(8))); INSERT INTO t1 VALUES (REPEAT('a',9),1); The key length is 8, while the blob length is 9. So we need to set the correct key length in Field_blob::sort_string(). --- sql/field.cc | 4 +++- .../mysql-test/rocksdb_rpl/r/rpl_blob_key.result | 9 +++++++++ .../mysql-test/rocksdb_rpl/t/rpl_blob_key.test | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 storage/rocksdb/mysql-test/rocksdb_rpl/r/rpl_blob_key.result create mode 100644 storage/rocksdb/mysql-test/rocksdb_rpl/t/rpl_blob_key.test diff --git a/sql/field.cc b/sql/field.cc index 7eb277e23d8..ec02ff0808e 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -8546,7 +8546,9 @@ void Field_blob::sort_string(uchar *to,uint length) Store length of blob last in blob to shorter blobs before longer blobs */ length-= packlength; - store_bigendian(buf.length(), to + length, packlength); + + uint key_length = MY_MIN(buf.length(), length); + store_bigendian(key_length, to + length, packlength); } #ifdef DBUG_ASSERT_EXISTS diff --git a/storage/rocksdb/mysql-test/rocksdb_rpl/r/rpl_blob_key.result b/storage/rocksdb/mysql-test/rocksdb_rpl/r/rpl_blob_key.result new file mode 100644 index 00000000000..6a18bcdeecc --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb_rpl/r/rpl_blob_key.result @@ -0,0 +1,9 @@ +include/master-slave.inc +[connection master] +CREATE TABLE t1 (b BLOB, i INT, KEY(b(8))) ENGINE=RocksDB; +INSERT INTO t1 VALUES (REPEAT('a',9),1); +UPDATE t1 SET i = 2; +connection slave; +connection master; +DROP TABLE t1; +include/rpl_end.inc diff --git a/storage/rocksdb/mysql-test/rocksdb_rpl/t/rpl_blob_key.test b/storage/rocksdb/mysql-test/rocksdb_rpl/t/rpl_blob_key.test new file mode 100644 index 00000000000..8c64ac979cb --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb_rpl/t/rpl_blob_key.test @@ -0,0 +1,15 @@ +--source include/have_rocksdb.inc +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +CREATE TABLE t1 (b BLOB, i INT, KEY(b(8))) ENGINE=RocksDB; +INSERT INTO t1 VALUES (REPEAT('a',9),1); + +UPDATE t1 SET i = 2; + +--sync_slave_with_master + +# Cleanup +--connection master +DROP TABLE t1; +--source include/rpl_end.inc