From db10e5cf6c41a6814c8e6a41e8d6edd082edb16c Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 16 Oct 2024 17:41:56 +0200 Subject: [PATCH] MDEV-35160 RBR does not work with vector type, ER_SLAVE_CONVERSION_FAILED --- mysql-test/suite/rpl/r/vector.result | 14 ++++++++++++++ mysql-test/suite/rpl/t/vector.test | 16 ++++++++++++++++ sql/sql_type_vector.cc | 9 +++++++++ sql/sql_type_vector.h | 2 ++ 4 files changed, 41 insertions(+) create mode 100644 mysql-test/suite/rpl/r/vector.result create mode 100644 mysql-test/suite/rpl/t/vector.test diff --git a/mysql-test/suite/rpl/r/vector.result b/mysql-test/suite/rpl/r/vector.result new file mode 100644 index 00000000000..682bbf7fef8 --- /dev/null +++ b/mysql-test/suite/rpl/r/vector.result @@ -0,0 +1,14 @@ +include/master-slave.inc +[connection master] +# +# MDEV-35160 RBR does not work with vector type, ER_SLAVE_CONVERSION_FAILED +# +create table t (pk int primary key, a vector(1) not null); +insert into t values (1, 0x00000000); +connection slave; +select pk, vec_totext(a) from t; +pk vec_totext(a) +1 [0] +connection master; +drop table t; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/vector.test b/mysql-test/suite/rpl/t/vector.test new file mode 100644 index 00000000000..8d7bd16b250 --- /dev/null +++ b/mysql-test/suite/rpl/t/vector.test @@ -0,0 +1,16 @@ +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +--echo # +--echo # MDEV-35160 RBR does not work with vector type, ER_SLAVE_CONVERSION_FAILED +--echo # +create table t (pk int primary key, a vector(1) not null); +insert into t values (1, 0x00000000); + +--sync_slave_with_master +select pk, vec_totext(a) from t; + +--connection master +drop table t; + +--source include/rpl_end.inc diff --git a/sql/sql_type_vector.cc b/sql/sql_type_vector.cc index 4eeaf1bc23a..6488a6f748e 100644 --- a/sql/sql_type_vector.cc +++ b/sql/sql_type_vector.cc @@ -320,3 +320,12 @@ int Field_vector::store(const char *from, size_t length, CHARSET_INFO *cs) return Field_varstring::store(from, length, cs); } + +enum_conv_type Field_vector::rpl_conv_type_from(const Conv_source &src, + const Relay_log_info *rli, const Conv_param ¶m) const +{ + if (src.type_handler() == &type_handler_varchar && + field_length == src.type_handler()->max_display_length_for_field(src)) + return rpl_conv_type_from_same_data_type(src.metadata(), rli, param); + return CONV_TYPE_IMPOSSIBLE; +} diff --git a/sql/sql_type_vector.h b/sql/sql_type_vector.h index 0cd79c9f53e..4c179d1d868 100644 --- a/sql/sql_type_vector.h +++ b/sql/sql_type_vector.h @@ -125,6 +125,8 @@ public: int store(double nr) override; int store(longlong nr, bool unsigned_val) override; int store_decimal(const my_decimal *) override; + enum_conv_type rpl_conv_type_from(const Conv_source &, const Relay_log_info *, + const Conv_param &) const override; uint size_of() const override { return sizeof(*this); } bool update_min(Field *, bool) override { return false; } // disable EITS bool update_max(Field *, bool) override { return false; } // disable EITS