[MDEV-12595] UNION converts INT to BIGINT Created: 2017-04-27  Updated: 2017-05-17  Resolved: 2017-05-17

Status: Closed
Project: MariaDB Server
Component/s: OTHER
Affects Version/s: 10.1, 10.2, 10.3
Fix Version/s: 10.3.1

Type: Bug Priority: Major
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: datatype

Issue Links:
Blocks
blocks MDEV-4912 Data type plugin API version 1 Closed
Relates
relates to MDEV-12594 UNION between fixed length double col... Closed
relates to MDEV-12599 UNION is not symmetric when mixing IN... Closed
relates to MDEV-12775 Reuse data type aggregation code for ... Closed

 Description   

This script creates columns of int(1) and int(2) data types:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 AS SELECT
  1,
  -1,
  COALESCE(1,1),
  COALESCE(-1,-1),
  COALESCE(1,-1),
  COALESCE(-1,1);
SHOW CREATE TABLE t1;

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `1` int(1) NOT NULL,
  `-1` int(2) NOT NULL,
  `COALESCE(1,1)` int(1) NOT NULL,
  `COALESCE(-1,-1)` int(2) NOT NULL,
  `COALESCE(1,-1)` int(2) NOT NULL,
  `COALESCE(-1,1)` int(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

int is preserved for literals.
int is also preserved when data type aggregation takes place in hybrid function, such as COALESCE.

However, int is not preserved when aggregation for UNION happens:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 AS SELECT 1 AS c1,1 AS c2,-1 AS c3,-1 AS c4 UNION SELECT 1,-1,1,-1;
SHOW CREATE TABLE t1;

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                      |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `c1` bigint(20) NOT NULL DEFAULT 0,
  `c2` bigint(20) NOT NULL DEFAULT 0,
  `c3` bigint(20) NOT NULL DEFAULT 0,
  `c4` bigint(20) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

int was not preserved. It created bigint columns instead, which looks too excessive.



 Comments   
Comment by Alexander Barkov [ 2017-05-17 ]

This problem was fixed by the patch for MDEV-12775

Generated at Thu Feb 08 07:58:57 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.