1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

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.
This commit is contained in:
Alexander Barkov
2017-04-24 16:08:28 +04:00
parent 791374354c
commit 5f1544fef3
5 changed files with 103 additions and 4 deletions

View File

@ -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