diff options
author | Alexander Barkov <bar@mariadb.org> | 2017-04-24 16:08:28 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2017-04-24 16:08:28 +0400 |
commit | 5f1544fef3c9aa97ec2bb9fd5625e1e7dce2c93a (patch) | |
tree | df34140a1a556a4b57212bbfd2f85f9f9c18b6ef /sql/field.cc | |
parent | 791374354c9f11fde2325777276522cdd71679c2 (diff) | |
download | mariadb-git-5f1544fef3c9aa97ec2bb9fd5625e1e7dce2c93a.tar.gz |
A cleanup for MDEV-9217 Split Item::tmp_table_field_from_field_type() into virtual methods in Type_handler
Fixing that the server tried to create the old decimal for:
CREATE TABLE t2 AS SELECT old_decimal_field FROM t1
UNION SELECT bigint_field FROM t1;
CREATE TABLE t2 AS SELECT old_decimal_field FROM t1
UNION SELECT mediumint_field FROM t1;
CREATE TABLE t2 AS SELECT year FROM t1
UNION SELECT old_decimal_field FROM t1;
CREATE TABLE t2 AS SELCT COALESCE(old_decimal_field) FROM t1;
Solution:
1. field_types_merge_rules[][] had three MYSQL_TYPE_DECIMAL remainders.
Fixing to MYSQL_TYPE_NEWDECIMAL, like it is done for all other type pairs.
This fixes the above queries with UNION.
2. Convert MYSQL_TYPE_DECIMAL to MYSQL_TYPE_NEWDECIMAL in
Item::tmp_table_field_from_field_type().
This fixed the above query with COALESCE.
3. Adding "new Field_decimal" into Type_handler_olddecimal::make_table_field().
In case if something goes wrong it will crash on assert only in debug builds,
while create the old decimal in release.
Note, this "new Field_decimal" will be needed later anyway,
when we reuse Type_handler::make_table_field() in make_field() in field.cc.
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 4 |
1 files changed, 2 insertions, 2 deletions
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 |