mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Adding support for MySQL-5.6 temporal column types:
TIME, DATETIME, TIMESTAMP added: mysql-test/r/type_temporal_mysql56.result mysql-test/std_data/mysql56datetime.MYD mysql-test/std_data/mysql56datetime.MYI mysql-test/std_data/mysql56datetime.frm mysql-test/std_data/mysql56time.MYD mysql-test/std_data/mysql56time.MYI mysql-test/std_data/mysql56time.frm mysql-test/std_data/mysql56timestamp.MYD mysql-test/std_data/mysql56timestamp.MYI mysql-test/std_data/mysql56timestamp.frm mysql-test/suite/rpl/r/rpl_temporal_mysql56.result mysql-test/suite/rpl/t/rpl_temporal_mysql56.test mysql-test/t/type_temporal_mysql56.test sql/compat56.cc sql/compat56.h modified: client/mysqlbinlog.cc include/my_time.h include/mysql.h.pp include/mysql_com.h mysql-test/r/statistics.result mysql-test/r/strict.result mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result sql-common/my_time.c sql/CMakeLists.txt sql/field.cc sql/field.h sql/item.cc sql/item_strfunc.cc sql/item_sum.cc sql/item_timefunc.cc sql/log_event.cc sql/opt_range.cc sql/opt_table_elimination.cc sql/protocol.cc sql/rpl_utility.cc sql/rpl_utility.h sql/sql_partition.cc sql/sql_prepare.cc sql/sql_select.cc sql/sql_table.cc sql/table.cc storage/perfschema/pfs_engine_table.cc
This commit is contained in:
@ -109,12 +109,15 @@ 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_TIMESTAMP:
|
||||
case MYSQL_TYPE_TIMESTAMP2:
|
||||
return 4;
|
||||
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_DATETIME2:
|
||||
return 8;
|
||||
|
||||
case MYSQL_TYPE_BIT:
|
||||
@ -262,12 +265,21 @@ uint32 table_def::calc_field_size(uint col, uchar *master_data) const
|
||||
case MYSQL_TYPE_TIME:
|
||||
length= 3;
|
||||
break;
|
||||
case MYSQL_TYPE_TIME2:
|
||||
length= my_time_binary_length(m_field_metadata[col]);
|
||||
break;
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
length= 4;
|
||||
break;
|
||||
case MYSQL_TYPE_TIMESTAMP2:
|
||||
length= my_timestamp_binary_length(m_field_metadata[col]);
|
||||
break;
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
length= 8;
|
||||
break;
|
||||
case MYSQL_TYPE_DATETIME2:
|
||||
length= my_datetime_binary_length(m_field_metadata[col]);
|
||||
break;
|
||||
case MYSQL_TYPE_BIT:
|
||||
{
|
||||
/*
|
||||
@ -376,6 +388,7 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_
|
||||
break;
|
||||
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
case MYSQL_TYPE_TIMESTAMP2:
|
||||
str->set_ascii(STRING_WITH_LEN("timestamp"));
|
||||
break;
|
||||
|
||||
@ -393,10 +406,12 @@ void show_sql_type(enum_field_types type, uint16 metadata, String *str, CHARSET_
|
||||
break;
|
||||
|
||||
case MYSQL_TYPE_TIME:
|
||||
case MYSQL_TYPE_TIME2:
|
||||
str->set_ascii(STRING_WITH_LEN("time"));
|
||||
break;
|
||||
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_DATETIME2:
|
||||
str->set_ascii(STRING_WITH_LEN("datetime"));
|
||||
break;
|
||||
|
||||
@ -615,6 +630,23 @@ 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)))
|
||||
{
|
||||
/*
|
||||
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);
|
||||
}
|
||||
else if (!slave_type_conversions_options)
|
||||
DBUG_RETURN(false);
|
||||
|
||||
@ -739,6 +771,9 @@ can_convert_field_to(Field *field,
|
||||
case MYSQL_TYPE_NULL:
|
||||
case MYSQL_TYPE_ENUM:
|
||||
case MYSQL_TYPE_SET:
|
||||
case MYSQL_TYPE_TIMESTAMP2:
|
||||
case MYSQL_TYPE_DATETIME2:
|
||||
case MYSQL_TYPE_TIME2:
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
DBUG_RETURN(false); // To keep GCC happy
|
||||
@ -939,7 +974,7 @@ TABLE *table_def::create_conversion_table(THD *thd, Relay_log_info *rli, TABLE *
|
||||
|
||||
DBUG_PRINT("debug", ("sql_type: %d, target_field: '%s', max_length: %d, decimals: %d,"
|
||||
" maybe_null: %d, unsigned_flag: %d, pack_length: %u",
|
||||
type(col), target_table->field[col]->field_name,
|
||||
binlog_type(col), target_table->field[col]->field_name,
|
||||
max_length, decimals, TRUE, FALSE, pack_length));
|
||||
field_def->init_for_tmp_table(type(col),
|
||||
max_length,
|
||||
@ -993,7 +1028,7 @@ table_def::table_def(unsigned char *types, ulong size,
|
||||
int index= 0;
|
||||
for (unsigned int i= 0; i < m_size; i++)
|
||||
{
|
||||
switch (m_type[i]) {
|
||||
switch (binlog_type(i)) {
|
||||
case MYSQL_TYPE_TINY_BLOB:
|
||||
case MYSQL_TYPE_BLOB:
|
||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||
@ -1042,6 +1077,11 @@ table_def::table_def(unsigned char *types, ulong size,
|
||||
m_field_metadata[i]= x;
|
||||
break;
|
||||
}
|
||||
case MYSQL_TYPE_TIME2:
|
||||
case MYSQL_TYPE_DATETIME2:
|
||||
case MYSQL_TYPE_TIMESTAMP2:
|
||||
m_field_metadata[i]= field_metadata[index++];
|
||||
break;
|
||||
default:
|
||||
m_field_metadata[i]= 0;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user