Browse Source

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().
pull/800/merge
Ming Lin 8 years ago
committed by Sergei Petrunia
parent
commit
87609324e0
  1. 4
      sql/field.cc
  2. 9
      storage/rocksdb/mysql-test/rocksdb_rpl/r/rpl_blob_key.result
  3. 15
      storage/rocksdb/mysql-test/rocksdb_rpl/t/rpl_blob_key.test

4
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

9
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

15
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
Loading…
Cancel
Save