From e5bc21af37c7dc6f388fb89f27f812713d088aa5 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 7 Oct 2014 10:54:14 +0200 Subject: [PATCH] MDEV-4813 Replication fails on updating a MEMORY table with an index using btree skip NULL VARCHAR key parts like it's done elsewhere --- mysql-test/suite/heap/btree_varchar_null.result | 6 ++++++ mysql-test/suite/heap/btree_varchar_null.test | 7 +++++++ storage/heap/hp_hash.c | 5 +++++ 3 files changed, 18 insertions(+) create mode 100644 mysql-test/suite/heap/btree_varchar_null.result create mode 100644 mysql-test/suite/heap/btree_varchar_null.test diff --git a/mysql-test/suite/heap/btree_varchar_null.result b/mysql-test/suite/heap/btree_varchar_null.result new file mode 100644 index 00000000000..9199cf6ef7d --- /dev/null +++ b/mysql-test/suite/heap/btree_varchar_null.result @@ -0,0 +1,6 @@ +create table t1 (f1 varchar(128), f2 varchar(128), key (f2,f1) using btree) engine=memory; +insert into t1 values (null,'not'),('one',null),('two',null),('three',''); +select * from t1 where f1 = 'one' and f2 is null; +f1 f2 +one NULL +drop table t1; diff --git a/mysql-test/suite/heap/btree_varchar_null.test b/mysql-test/suite/heap/btree_varchar_null.test new file mode 100644 index 00000000000..8e6625a2bfa --- /dev/null +++ b/mysql-test/suite/heap/btree_varchar_null.test @@ -0,0 +1,7 @@ +# +# MDEV-4813 Replication fails on updating a MEMORY table with an index using btree +# +create table t1 (f1 varchar(128), f2 varchar(128), key (f2,f1) using btree) engine=memory; +insert into t1 values (null,'not'),('one',null),('two',null),('three',''); +select * from t1 where f1 = 'one' and f2 is null; +drop table t1; diff --git a/storage/heap/hp_hash.c b/storage/heap/hp_hash.c index 2abed55459c..2d4c0e9a031 100644 --- a/storage/heap/hp_hash.c +++ b/storage/heap/hp_hash.c @@ -876,8 +876,13 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, if (seg->null_bit) { if (!(*key++= (char) 1 - *old++)) + { + /* Add key pack length (2) to key for VARCHAR segments */ + if (seg->type == HA_KEYTYPE_VARTEXT1) + old+= 2; continue; } + } if (seg->flag & HA_SWAP_KEY) { uint length= seg->length;