1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

MDEV-5297 TIME(0), TIMESTAMP(0) and DATETIME(0) are self-incompatible during replication (upstream)

Fixed.
This commit is contained in:
Alexander Barkov
2013-12-06 19:02:55 +04:00
parent 0afd292073
commit 1f4f425a20
9 changed files with 123 additions and 13 deletions

View File

@ -46,6 +46,19 @@ uint32 uint_max(int bits) {
}
/**
Calculate display length for MySQL56 temporal data types from their metadata.
It contains fractional precision in the low 16-bit word.
*/
static uint32
max_display_length_for_temporal2_field(uint32 int_display_length,
unsigned int metadata)
{
metadata&= 0x00ff;
return int_display_length + metadata + (metadata ? 1 : 0);
}
/**
Compute the maximum display length of a field.
@ -109,17 +122,23 @@ max_display_length_for_field(enum_field_types sql_type, unsigned int metadata)
case MYSQL_TYPE_DATE:
case MYSQL_TYPE_TIME:
case MYSQL_TYPE_TIME2:
return 3;
case MYSQL_TYPE_TIME2:
return max_display_length_for_temporal2_field(MIN_TIME_WIDTH, metadata);
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_TIMESTAMP2:
return 4;
case MYSQL_TYPE_TIMESTAMP2:
return max_display_length_for_temporal2_field(MAX_DATETIME_WIDTH, metadata);
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_DATETIME2:
return 8;
case MYSQL_TYPE_DATETIME2:
return max_display_length_for_temporal2_field(MAX_DATETIME_WIDTH, metadata);
case MYSQL_TYPE_BIT:
/*
Decode the size of the bit field from the master.
@ -630,19 +649,32 @@ can_convert_field_to(Field *field,
else
DBUG_RETURN(false);
}
else if (metadata == 0 &&
((field->real_type() == MYSQL_TYPE_TIMESTAMP2 &&
source_type == MYSQL_TYPE_TIMESTAMP) ||
(field->real_type() == MYSQL_TYPE_TIME2 &&
source_type == MYSQL_TYPE_TIME) ||
(field->real_type() == MYSQL_TYPE_DATETIME2 &&
source_type == MYSQL_TYPE_DATETIME)))
else if (
/*
Conversion from MariaDB TIMESTAMP(0), TIME(0), DATETIME(0)
to the corresponding MySQL56 types is non-lossy.
*/
(metadata == 0 &&
((field->real_type() == MYSQL_TYPE_TIMESTAMP2 &&
source_type == MYSQL_TYPE_TIMESTAMP) ||
(field->real_type() == MYSQL_TYPE_TIME2 &&
source_type == MYSQL_TYPE_TIME) ||
(field->real_type() == MYSQL_TYPE_DATETIME2 &&
source_type == MYSQL_TYPE_DATETIME))) ||
/*
Conversion from MySQL56 TIMESTAMP(N), TIME(N), DATETIME(N)
to the corresponding MariaDB or MySQL55 types is non-lossy.
*/
(metadata == field->decimals() &&
((field->real_type() == MYSQL_TYPE_TIMESTAMP &&
source_type == MYSQL_TYPE_TIMESTAMP2) ||
(field->real_type() == MYSQL_TYPE_TIME &&
source_type == MYSQL_TYPE_TIME2) ||
(field->real_type() == MYSQL_TYPE_DATETIME &&
source_type == MYSQL_TYPE_DATETIME2))))
{
/*
TS-TODO: conversion from FSP1>FSP2.
Can do non-lossy conversion
from old TIME, TIMESTAMP, DATETIME
to MySQL56 TIME(0), TIMESTAMP(0), DATETIME(0).
*/
*order_var= -1;
DBUG_RETURN(true);