mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 14:54:20 +01:00
WL#5151: Conversion between different types when replicating
Bug#49836 reports that the geometry type does not work with WL#5151 applied. The GEOMETRY type inherits the blob comparison function, which read the pack length from the metadata. The GEOMETRY type does not fill in the metadata with anything sensible, so it is always zero, meaning that the pack length for the source type is considered zero, rendering it always "smaller" than the target type which has pack length 4 (without pointer). This patch fixes the problem by defining Field_geom::pack_length_from_metadata() to always use the same as Field_geom::row_pack_length().
This commit is contained in:
parent
b524f272d4
commit
a22bc99ff6
3 changed files with 15 additions and 0 deletions
|
@ -12,6 +12,13 @@ connection slave;
|
|||
let $if_is_lossy = `SELECT FIND_IN_SET('ALL_LOSSY', @@SLAVE_TYPE_CONVERSIONS)`;
|
||||
let $if_is_non_lossy = `SELECT FIND_IN_SET('ALL_NON_LOSSY', @@SLAVE_TYPE_CONVERSIONS)`;
|
||||
|
||||
let $source_type = GEOMETRY;
|
||||
let $target_type = GEOMETRY;
|
||||
let $source_value = PointFromText('POINT(10 10)');
|
||||
let $target_value = PointFromText('POINT(10 10)');
|
||||
let $can_convert = 1;
|
||||
source extra/rpl_tests/check_type.inc;
|
||||
|
||||
let $source_type = BIT(1);
|
||||
let $target_type = BIT(1);
|
||||
let $source_value = b'1';
|
||||
|
|
|
@ -69,6 +69,7 @@ RESET MASTER;
|
|||
include/start_slave.inc
|
||||
**** Result of conversions ****
|
||||
Source_Type Target_Type All_Type_Conversion_Flags Value_On_Slave
|
||||
GEOMETRY GEOMETRY <Correct value>
|
||||
BIT(1) BIT(1) <Correct value>
|
||||
DATE DATE <Correct value>
|
||||
ENUM('master',' ENUM('master',' <Correct value>
|
||||
|
@ -171,6 +172,7 @@ BIT(5) BIT(6) <Correct error>
|
|||
BIT(6) BIT(5) <Correct error>
|
||||
BIT(5) BIT(12) <Correct error>
|
||||
BIT(12) BIT(5) <Correct error>
|
||||
GEOMETRY GEOMETRY ALL_NON_LOSSY <Correct value>
|
||||
BIT(1) BIT(1) ALL_NON_LOSSY <Correct value>
|
||||
DATE DATE ALL_NON_LOSSY <Correct value>
|
||||
ENUM('master',' ENUM('master',' ALL_NON_LOSSY <Correct value>
|
||||
|
@ -273,6 +275,7 @@ BIT(5) BIT(6) ALL_NON_LOSSY <Correct value>
|
|||
BIT(6) BIT(5) ALL_NON_LOSSY <Correct error>
|
||||
BIT(5) BIT(12) ALL_NON_LOSSY <Correct value>
|
||||
BIT(12) BIT(5) ALL_NON_LOSSY <Correct error>
|
||||
GEOMETRY GEOMETRY ALL_LOSSY <Correct value>
|
||||
BIT(1) BIT(1) ALL_LOSSY <Correct value>
|
||||
DATE DATE ALL_LOSSY <Correct value>
|
||||
ENUM('master',' ENUM('master',' ALL_LOSSY <Correct value>
|
||||
|
@ -375,6 +378,7 @@ BIT(5) BIT(6) ALL_LOSSY <Correct error>
|
|||
BIT(6) BIT(5) ALL_LOSSY <Correct value>
|
||||
BIT(5) BIT(12) ALL_LOSSY <Correct error>
|
||||
BIT(12) BIT(5) ALL_LOSSY <Correct value>
|
||||
GEOMETRY GEOMETRY ALL_LOSSY,ALL_NON_LOSSY <Correct value>
|
||||
BIT(1) BIT(1) ALL_LOSSY,ALL_NON_LOSSY <Correct value>
|
||||
DATE DATE ALL_LOSSY,ALL_NON_LOSSY <Correct value>
|
||||
ENUM('master',' ENUM('master',' ALL_LOSSY,ALL_NON_LOSSY <Correct value>
|
||||
|
|
|
@ -1817,6 +1817,10 @@ public:
|
|||
uint size_of() const { return sizeof(*this); }
|
||||
int reset(void) { return !maybe_null() || Field_blob::reset(); }
|
||||
geometry_type get_geometry_type() { return geom_type; };
|
||||
uint pack_length_from_metadata(uint field_metadata)
|
||||
{
|
||||
return pack_length_no_ptr();
|
||||
}
|
||||
};
|
||||
#endif /*HAVE_SPATIAL*/
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue