From 950bb9ba8023b0d042ad5152d7ced16897b05750 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 efc20fa37fcce..3d49e97d30eec 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -8539,7 +8539,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); } #ifndef DBUG_OFF 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 0000000000000..6a18bcdeecc44 --- /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 0000000000000..8c64ac979cbaa --- /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