diff --git a/mysql-test/r/type_decimal.result b/mysql-test/r/type_decimal.result index 0ead4ec9aa2..52ea0092ffa 100644 --- a/mysql-test/r/type_decimal.result +++ b/mysql-test/r/type_decimal.result @@ -1019,3 +1019,52 @@ cast('-0.0' as decimal(5,1)) < 0 # # End of 5.5 tests # +# +# Start of 10.3 tests +# +# +# MDEV-9217 Split Item::tmp_table_field_from_field_type() into virtual methods in Type_handler +# +# This creates the old DECIMAL. Will be fixed in MDEV-12574. +CREATE TABLE t1 AS SELECT MAX(a) FROM t1dec102; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `MAX(a)` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 AS SELECT COALESCE(a) FROM t1dec102; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `COALESCE(a)` decimal(12,2) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a BIGINT); +CREATE TABLE t2 AS SELECT a FROM t1dec102 UNION SELECT a FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` decimal(21,2) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1 (a MEDIUMINT); +CREATE TABLE t2 AS SELECT a FROM t1dec102 UNION SELECT a FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` decimal(12,2) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1 (a YEAR); +CREATE TABLE t2 AS SELECT a FROM t1 UNION SELECT a FROM t1dec102; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` decimal(12,2) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2; +DROP TABLE t1; +DROP TABLE t1dec102; diff --git a/mysql-test/t/type_decimal.test b/mysql-test/t/type_decimal.test index 777bb2f23e5..51fa3bb7461 100644 --- a/mysql-test/t/type_decimal.test +++ b/mysql-test/t/type_decimal.test @@ -612,3 +612,46 @@ select cast('-0.0' as decimal(5,1)) < 0; --echo # --echo # End of 5.5 tests --echo # + +--echo # +--echo # Start of 10.3 tests +--echo # + +--echo # +--echo # MDEV-9217 Split Item::tmp_table_field_from_field_type() into virtual methods in Type_handler +--echo # + +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file std_data/old_decimal/t1dec102.frm $MYSQLD_DATADIR/test/t1dec102.frm +--copy_file std_data/old_decimal/t1dec102.MYD $MYSQLD_DATADIR/test/t1dec102.MYD +--copy_file std_data/old_decimal/t1dec102.MYI $MYSQLD_DATADIR/test/t1dec102.MYI + +--echo # This creates the old DECIMAL. Will be fixed in MDEV-12574. +CREATE TABLE t1 AS SELECT MAX(a) FROM t1dec102; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT COALESCE(a) FROM t1dec102; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a BIGINT); +CREATE TABLE t2 AS SELECT a FROM t1dec102 UNION SELECT a FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; +DROP TABLE t1; + +CREATE TABLE t1 (a MEDIUMINT); +CREATE TABLE t2 AS SELECT a FROM t1dec102 UNION SELECT a FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2; +DROP TABLE t1; + +CREATE TABLE t1 (a YEAR); +CREATE TABLE t2 AS SELECT a FROM t1 UNION SELECT a FROM t1dec102; +SHOW CREATE TABLE t2; +DROP TABLE t2; +DROP TABLE t1; + +DROP TABLE t1dec102; diff --git a/sql/field.cc b/sql/field.cc index 91efcd52b0f..6f80646817c 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -125,7 +125,7 @@ static enum_field_types field_types_merge_rules [FIELDTYPE_NUM][FIELDTYPE_NUM]= //MYSQL_TYPE_NULL MYSQL_TYPE_TIMESTAMP MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_LONGLONG MYSQL_TYPE_INT24 - MYSQL_TYPE_DECIMAL, MYSQL_TYPE_DECIMAL, + MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL, //MYSQL_TYPE_DATE MYSQL_TYPE_TIME MYSQL_TYPE_VARCHAR, MYSQL_TYPE_VARCHAR, //MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR @@ -520,7 +520,7 @@ static enum_field_types field_types_merge_rules [FIELDTYPE_NUM][FIELDTYPE_NUM]= /* MYSQL_TYPE_YEAR -> */ { //MYSQL_TYPE_DECIMAL MYSQL_TYPE_TINY - MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, + MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TINY, //MYSQL_TYPE_SHORT MYSQL_TYPE_LONG MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, //MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE diff --git a/sql/item.cc b/sql/item.cc index 307c299e410..b38dc90d9ad 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6284,6 +6284,9 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table) Record_addr addr(maybe_null); switch (handler->field_type()) { + case MYSQL_TYPE_DECIMAL: + handler= &type_handler_newdecimal; + break; case MYSQL_TYPE_NULL: case MYSQL_TYPE_STRING: case MYSQL_TYPE_ENUM: diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 659e5839585..a6c2f3e5e23 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -1281,11 +1281,15 @@ Type_handler_olddecimal::make_table_field(const LEX_CSTRING *name, /* Currently make_table_field() is used for Item purpose only. On Item level we have type_handler_newdecimal only. - Will be implemented when we reuse Type_handler::make_table_field() + For now we have DBUG_ASSERT(0). + It will be removed when we reuse Type_handler::make_table_field() in make_field() in field.cc, to open old tables with old decimal. */ DBUG_ASSERT(0); - return NULL; + return new (table->in_use->mem_root) + Field_decimal(addr.ptr, attr.max_length, addr.null_ptr, addr.null_bit, + Field::NONE, name, attr.decimals, + 0/*zerofill*/,attr.unsigned_flag); }