From 35acf39b5c0c520e23f9c3cf9c10d4d961a5366b Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Thu, 11 Jun 2020 18:14:39 +0530 Subject: [PATCH] MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon INSERT into RocksDB table For INET6 columns the values are stored as BINARY columns and returned to the client in TEXT format. For rocksdb the indexes store mem-comparable images for columns, so use the pack_length() to store the mem-comparable form for INET6 columns. This would also remain consistent with CHAR columns. --- storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result | 7 +++++++ storage/rocksdb/mysql-test/rocksdb/t/rocksdb.test | 8 ++++++++ storage/rocksdb/rdb_datadic.cc | 4 +++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result index f2f9adebf46..53d59650cd2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb.result @@ -2633,4 +2633,11 @@ DELETE t2, t1 FROM t2 LEFT JOIN t1 ON t2.id2 = t1.id2 AND t2.id1 = t1.id1 WHERE SET rocksdb_bulk_load_size= @save_rocksdb_bulk_load_size; SET rocksdb_commit_in_the_middle=0; DROP TABLE t1, t2; +# +# MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon +# INSERT into RocksDB table +# +CREATE TABLE t1 (a INET6 NOT NULL, KEY (a)) ENGINE=RocksDB; +INSERT INTO t1 VALUES ('41::1'),('61::1'); +DROP TABLE t1; SET GLOBAL ROCKSDB_PAUSE_BACKGROUND_WORK = @ORIG_PAUSE_BACKGROUND_WORK; diff --git a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb.test b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb.test index 84a9a5bbd5a..f7de167bd96 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/rocksdb.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/rocksdb.test @@ -1962,5 +1962,13 @@ SET rocksdb_bulk_load_size= @save_rocksdb_bulk_load_size; SET rocksdb_commit_in_the_middle=0; DROP TABLE t1, t2; +--echo # +--echo # MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon +--echo # INSERT into RocksDB table +--echo # + +CREATE TABLE t1 (a INET6 NOT NULL, KEY (a)) ENGINE=RocksDB; +INSERT INTO t1 VALUES ('41::1'),('61::1'); +DROP TABLE t1; SET GLOBAL ROCKSDB_PAUSE_BACKGROUND_WORK = @ORIG_PAUSE_BACKGROUND_WORK; diff --git a/storage/rocksdb/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc index 21a9b57b555..6e73535d1de 100644 --- a/storage/rocksdb/rdb_datadic.cc +++ b/storage/rocksdb/rdb_datadic.cc @@ -3317,7 +3317,9 @@ bool Rdb_field_packing::setup(const Rdb_key_def *const key_descr, field->field_length = field->char_length() * cs->mbmaxlen. */ const CHARSET_INFO *cs = field->charset(); - m_max_image_len = cs->strnxfrmlen(field->field_length); + m_max_image_len = cs->strnxfrmlen(type == MYSQL_TYPE_STRING ? + field->pack_length() : + field->field_length); } const bool is_varchar = (type == MYSQL_TYPE_VARCHAR); const CHARSET_INFO *cs = field->charset();