Description:
LEAST and GREATEST does not use the same logic as UNION and COALESCE, hence derived data types become inconsistent.
Notice also that result type and field type for LEAST/GREATEST nodes differ, meaning that comparison may be performed in a different type than the derived field type, which is both confusing and differing from how UNION performs comparisons.
How to repeat:
Note: due to bug#25123820, run this test case with sql_mode='';
CREATE TABLE u AS
SELECT 5 as c1, 5 as c2, 5 as c3, 5 as c4, 5 as c5, 5 as c6,
5.5 as c12, 5.5 as c13, 5.5 as c14, 5.5 as c15, 5.5 as c16,
5.5e5 as c23, 5.5e5 as c24, 5.5e5 as c25, 5.5e5 as c26,
'5' as c34, '5' as c35, '5' as c36,
date '2005-05-05' as c45, date '2005-05-05' as c46,
time '05:05:05.555555' as c56
UNION
SELECT 5.5, 5.5e5, '5', date '2005-05-05', time '05:05:05.555555',
timestamp '2005-05-05 05:05:05.555555',
5.5e5, '5', date '2005-05-05', time '05:05:05.555555',
timestamp '2005-05-05 05:05:05.555555',
'5', date '2005-05-05', time '05:05:05.555555',
timestamp '2005-05-05 05:05:05.555555',
date '2005-05-05', time '05:05:05.555555',
timestamp '2005-05-05 05:05:05.555555',
time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555',
timestamp '2005-05-05 05:05:05.555555';
CREATE TABLE c AS
SELECT COALESCE(5, 5.5) AS c1,
COALESCE(5, 5.5e5) AS c2,
COALESCE(5, '5') AS c3,
COALESCE(5, date '2005-05-05') AS c4,
COALESCE(5, time '05:05:05.555555') AS c5,
COALESCE(5, timestamp '2005-05-05 05:05:05.555555') AS c6,
COALESCE(5.5, 5.5e5) AS c12,
COALESCE(5.5, '5') AS c13,
COALESCE(5.5, date '2005-05-05') AS c14,
COALESCE(5.5, time '05:05:05.555555') AS c15,
COALESCE(5.5, timestamp '2005-05-05 05:05:05.555555') AS c16,
COALESCE(5.5e5, '5') AS c23,
COALESCE(5.5e5, date '2005-05-05') AS c24,
COALESCE(5.5e5, time '05:05:05.555555') AS c25,
COALESCE(5.5e5, timestamp '2005-05-05 05:05:05.555555') AS c26,
COALESCE('5', date '2005-05-05') AS c34,
COALESCE('5', time '05:05:05.555555') AS c35,
COALESCE('5', timestamp '2005-05-05 05:05:05.555555') AS c36,
COALESCE(date '2005-05-05', time '05:05:05.555555') AS c45,
COALESCE(date '2005-05-05', timestamp '2005-05-05 05:05:05.555555') AS c46,
COALESCE(time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555') AS c56;
CREATE TABLE g AS
SELECT GREATEST(5, 5.5) AS c1,
GREATEST(5, 5.5e5) AS c2,
GREATEST(5, '5') AS c3,
GREATEST(5, date '2005-05-05') AS c4,
GREATEST(5, time '05:05:05.555555') AS c5,
GREATEST(5, timestamp '2005-05-05 05:05:05.555555') AS c6,
GREATEST(5.5, 5.5e5) AS c12,
GREATEST(5.5, '5') AS c13,
GREATEST(5.5, date '2005-05-05') AS c14,
GREATEST(5.5, time '05:05:05.555555') AS c15,
GREATEST(5.5, timestamp '2005-05-05 05:05:05.555555') AS c16,
GREATEST(5.5e5, '5') AS c23,
GREATEST(5.5e5, date '2005-05-05') AS c24,
GREATEST(5.5e5, time '05:05:05.555555') AS c25,
GREATEST(5.5e5, timestamp '2005-05-05 05:05:05.555555') AS c26,
GREATEST('5', date '2005-05-05') AS c34,
GREATEST('5', time '05:05:05.555555') AS c35,
GREATEST('5', timestamp '2005-05-05 05:05:05.555555') AS c36,
GREATEST(date '2005-05-05', time '05:05:05.555555') AS c45,
GREATEST(date '2005-05-05', timestamp '2005-05-05 05:05:05.555555') AS c46,
GREATEST(time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555') AS c56;
SHOW CREATE TABLE u;
SHOW CREATE TABLE c;
SHOW CREATE TABLE g;
DROP TABLE u, c, g;
Suggested fix:
Make LEAST and GREATEST use same data type derivation and comparison as UNION and COALESCE.
Description: LEAST and GREATEST does not use the same logic as UNION and COALESCE, hence derived data types become inconsistent. Notice also that result type and field type for LEAST/GREATEST nodes differ, meaning that comparison may be performed in a different type than the derived field type, which is both confusing and differing from how UNION performs comparisons. How to repeat: Note: due to bug#25123820, run this test case with sql_mode=''; CREATE TABLE u AS SELECT 5 as c1, 5 as c2, 5 as c3, 5 as c4, 5 as c5, 5 as c6, 5.5 as c12, 5.5 as c13, 5.5 as c14, 5.5 as c15, 5.5 as c16, 5.5e5 as c23, 5.5e5 as c24, 5.5e5 as c25, 5.5e5 as c26, '5' as c34, '5' as c35, '5' as c36, date '2005-05-05' as c45, date '2005-05-05' as c46, time '05:05:05.555555' as c56 UNION SELECT 5.5, 5.5e5, '5', date '2005-05-05', time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555', 5.5e5, '5', date '2005-05-05', time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555', '5', date '2005-05-05', time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555', date '2005-05-05', time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555', time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555', timestamp '2005-05-05 05:05:05.555555'; CREATE TABLE c AS SELECT COALESCE(5, 5.5) AS c1, COALESCE(5, 5.5e5) AS c2, COALESCE(5, '5') AS c3, COALESCE(5, date '2005-05-05') AS c4, COALESCE(5, time '05:05:05.555555') AS c5, COALESCE(5, timestamp '2005-05-05 05:05:05.555555') AS c6, COALESCE(5.5, 5.5e5) AS c12, COALESCE(5.5, '5') AS c13, COALESCE(5.5, date '2005-05-05') AS c14, COALESCE(5.5, time '05:05:05.555555') AS c15, COALESCE(5.5, timestamp '2005-05-05 05:05:05.555555') AS c16, COALESCE(5.5e5, '5') AS c23, COALESCE(5.5e5, date '2005-05-05') AS c24, COALESCE(5.5e5, time '05:05:05.555555') AS c25, COALESCE(5.5e5, timestamp '2005-05-05 05:05:05.555555') AS c26, COALESCE('5', date '2005-05-05') AS c34, COALESCE('5', time '05:05:05.555555') AS c35, COALESCE('5', timestamp '2005-05-05 05:05:05.555555') AS c36, COALESCE(date '2005-05-05', time '05:05:05.555555') AS c45, COALESCE(date '2005-05-05', timestamp '2005-05-05 05:05:05.555555') AS c46, COALESCE(time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555') AS c56; CREATE TABLE g AS SELECT GREATEST(5, 5.5) AS c1, GREATEST(5, 5.5e5) AS c2, GREATEST(5, '5') AS c3, GREATEST(5, date '2005-05-05') AS c4, GREATEST(5, time '05:05:05.555555') AS c5, GREATEST(5, timestamp '2005-05-05 05:05:05.555555') AS c6, GREATEST(5.5, 5.5e5) AS c12, GREATEST(5.5, '5') AS c13, GREATEST(5.5, date '2005-05-05') AS c14, GREATEST(5.5, time '05:05:05.555555') AS c15, GREATEST(5.5, timestamp '2005-05-05 05:05:05.555555') AS c16, GREATEST(5.5e5, '5') AS c23, GREATEST(5.5e5, date '2005-05-05') AS c24, GREATEST(5.5e5, time '05:05:05.555555') AS c25, GREATEST(5.5e5, timestamp '2005-05-05 05:05:05.555555') AS c26, GREATEST('5', date '2005-05-05') AS c34, GREATEST('5', time '05:05:05.555555') AS c35, GREATEST('5', timestamp '2005-05-05 05:05:05.555555') AS c36, GREATEST(date '2005-05-05', time '05:05:05.555555') AS c45, GREATEST(date '2005-05-05', timestamp '2005-05-05 05:05:05.555555') AS c46, GREATEST(time '05:05:05.555555', timestamp '2005-05-05 05:05:05.555555') AS c56; SHOW CREATE TABLE u; SHOW CREATE TABLE c; SHOW CREATE TABLE g; DROP TABLE u, c, g; Suggested fix: Make LEAST and GREATEST use same data type derivation and comparison as UNION and COALESCE.