From 154ec0f4201a617be5998537e29f0ad15e44f803 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 19 Nov 2014 12:08:35 +0400 Subject: [PATCH] MDEV-6993 Bad results with join comparing DECIMAL and ENUM/SET columns --- mysql-test/r/type_enum.result | 34 ++++++++++++++++++++++++++++++++++ mysql-test/r/type_set.result | 34 ++++++++++++++++++++++++++++++++++ mysql-test/t/type_enum.test | 21 +++++++++++++++++++++ mysql-test/t/type_set.test | 21 +++++++++++++++++++++ sql/field_conv.cc | 4 ++++ 5 files changed, 114 insertions(+) diff --git a/mysql-test/r/type_enum.result b/mysql-test/r/type_enum.result index 9c42d5ca4c2..dd9277517d8 100644 --- a/mysql-test/r/type_enum.result +++ b/mysql-test/r/type_enum.result @@ -2046,5 +2046,39 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL id 6 NULL 16 Using where; Using index DROP TABLE t1; # +# MDEV-6993 Bad results with join comparing DECIMAL and ENUM/SET columns +# +CREATE TABLE t1 (c1 DECIMAL(10,1) PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (c1 ENUM('a','b')); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 NATURAL JOIN t2; +c1 +1.0 +2.0 +ALTER TABLE t2 ADD PRIMARY KEY(c1); +SELECT t1.* FROM t1 NATURAL JOIN t2; +c1 +1.0 +2.0 +SELECT t1.* FROM t1 LEFT OUTER JOIN t2 USING (c1); +c1 +1.0 +2.0 +DROP TABLE t1,t2; +CREATE TABLE t1 (a DECIMAL(10,1), b ENUM('1','2')); +INSERT INTO t1 (a) VALUES (1),(2); +UPDATE t1 SET b=a; +SELECT * FROM t1; +a b +1.0 1 +2.0 2 +ALTER TABLE t1 MODIFY a ENUM('1','2'); +SELECT * FROM t1; +a b +1 1 +2 2 +DROP TABLE t1; +# # End of 10.0 tests # diff --git a/mysql-test/r/type_set.result b/mysql-test/r/type_set.result index 884b9d2e6b7..f3b7019c989 100644 --- a/mysql-test/r/type_set.result +++ b/mysql-test/r/type_set.result @@ -227,5 +227,39 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 index PRIMARY PRIMARY 1 NULL 2 Using where; Using index DROP TABLE IF EXISTS t1,t2; # +# MDEV-6993 Bad results with join comparing DECIMAL and ENUM/SET columns +# +CREATE TABLE t1 (c1 DECIMAL(10,1) PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (c1 SET('a','b')); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 NATURAL JOIN t2; +c1 +1.0 +2.0 +ALTER TABLE t2 ADD PRIMARY KEY(c1); +SELECT t1.* FROM t1 NATURAL JOIN t2; +c1 +1.0 +2.0 +SELECT t1.* FROM t1 LEFT OUTER JOIN t2 USING (c1); +c1 +1.0 +2.0 +DROP TABLE t1,t2; +CREATE TABLE t1 (a DECIMAL(10,1), b SET('1','2')); +INSERT INTO t1 (a) VALUES (1),(2); +UPDATE t1 SET b=a; +SELECT * FROM t1; +a b +1.0 1 +2.0 2 +ALTER TABLE t1 MODIFY a SET('1','2'); +SELECT * FROM t1; +a b +1 1 +2 2 +DROP TABLE t1; +# # End of 10.0 tests # diff --git a/mysql-test/t/type_enum.test b/mysql-test/t/type_enum.test index 58e0c7e82cf..9ce34c0b55b 100644 --- a/mysql-test/t/type_enum.test +++ b/mysql-test/t/type_enum.test @@ -333,6 +333,27 @@ SELECT id,MIN(a),MAX(a) FROM t1 WHERE a<=3 GROUP BY id; EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a<=3 GROUP BY id; DROP TABLE t1; +--echo # +--echo # MDEV-6993 Bad results with join comparing DECIMAL and ENUM/SET columns +--echo # +CREATE TABLE t1 (c1 DECIMAL(10,1) PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (c1 ENUM('a','b')); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 NATURAL JOIN t2; +ALTER TABLE t2 ADD PRIMARY KEY(c1); +SELECT t1.* FROM t1 NATURAL JOIN t2; +SELECT t1.* FROM t1 LEFT OUTER JOIN t2 USING (c1); +DROP TABLE t1,t2; + +CREATE TABLE t1 (a DECIMAL(10,1), b ENUM('1','2')); +INSERT INTO t1 (a) VALUES (1),(2); +UPDATE t1 SET b=a; +SELECT * FROM t1; +ALTER TABLE t1 MODIFY a ENUM('1','2'); +SELECT * FROM t1; +DROP TABLE t1; + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/type_set.test b/mysql-test/t/type_set.test index 3ed6c818831..8b9da6962d5 100644 --- a/mysql-test/t/type_set.test +++ b/mysql-test/t/type_set.test @@ -161,6 +161,27 @@ SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1; EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1; DROP TABLE IF EXISTS t1,t2; +--echo # +--echo # MDEV-6993 Bad results with join comparing DECIMAL and ENUM/SET columns +--echo # +CREATE TABLE t1 (c1 DECIMAL(10,1) PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (c1 SET('a','b')); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 NATURAL JOIN t2; +ALTER TABLE t2 ADD PRIMARY KEY(c1); +SELECT t1.* FROM t1 NATURAL JOIN t2; +SELECT t1.* FROM t1 LEFT OUTER JOIN t2 USING (c1); +DROP TABLE t1,t2; + +CREATE TABLE t1 (a DECIMAL(10,1), b SET('1','2')); +INSERT INTO t1 (a) VALUES (1),(2); +UPDATE t1 SET b=a; +SELECT * FROM t1; +ALTER TABLE t1 MODIFY a SET('1','2'); +SELECT * FROM t1; +DROP TABLE t1; + --echo # --echo # End of 10.0 tests --echo # diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 65f3e71f430..e31f7c5f005 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -792,6 +792,10 @@ Copy_field::get_copy_func(Field *to,Field *from) else if (to->real_type() != from->real_type() || to_length != from_length) { + if ((to->real_type() == MYSQL_TYPE_ENUM || + to->real_type() == MYSQL_TYPE_SET) && + from->real_type() == MYSQL_TYPE_NEWDECIMAL) + return do_field_decimal; if (to->real_type() == MYSQL_TYPE_DECIMAL || to->result_type() == STRING_RESULT) return do_field_string;