summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/ctype_collate.result13
-rw-r--r--mysql-test/r/union.result2
-rw-r--r--mysql-test/t/ctype_collate.test12
-rw-r--r--mysql-test/t/union.test2
-rw-r--r--sql/item.cc11
5 files changed, 37 insertions, 3 deletions
diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result
index bc77e9c2362..cdf890f2c6c 100644
--- a/mysql-test/r/ctype_collate.result
+++ b/mysql-test/r/ctype_collate.result
@@ -535,6 +535,19 @@ s2 CHAR(5) COLLATE latin1_swedish_ci);
SELECT * FROM t1 WHERE s1 = s2;
ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='
DROP TABLE t1;
+CREATE TABLE t1
+(s1 CHAR(5) COLLATE latin1_german1_ci,
+s2 CHAR(5) COLLATE latin1_swedish_ci,
+s3 CHAR(5) COLLATE latin1_bin);
+INSERT INTO t1 VALUES ('a','A','A');
+SELECT * FROM t1 WHERE s1 = s2;
+ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='
+SELECT * FROM t1 WHERE s1 = s3;
+s1 s2 s3
+SELECT * FROM t1 WHERE s2 = s3;
+s1 s2 s3
+a A A
+DROP TABLE t1;
SET NAMES latin1;
CREATE TABLE t1
(s1 char(10) COLLATE latin1_german1_ci,
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 96baf36d151..c140ecd26e1 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -1103,7 +1103,7 @@ count(*)
drop table t1;
create table t2 (
a char character set latin1 collate latin1_swedish_ci,
-b char character set latin1 collate latin1_bin);
+b char character set latin1 collate latin1_german1_ci);
create table t1 as
(select a from t2) union
(select b from t2);
diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test
index 3599beeacc4..b65067a36cf 100644
--- a/mysql-test/t/ctype_collate.test
+++ b/mysql-test/t/ctype_collate.test
@@ -158,6 +158,18 @@ SELECT * FROM t1 WHERE s1 = s2;
DROP TABLE t1;
+CREATE TABLE t1
+(s1 CHAR(5) COLLATE latin1_german1_ci,
+ s2 CHAR(5) COLLATE latin1_swedish_ci,
+ s3 CHAR(5) COLLATE latin1_bin);
+INSERT INTO t1 VALUES ('a','A','A');
+--error 1267
+SELECT * FROM t1 WHERE s1 = s2;
+SELECT * FROM t1 WHERE s1 = s3;
+SELECT * FROM t1 WHERE s2 = s3;
+DROP TABLE t1;
+
+
#
# Test that optimizer doesn't use indexes with wrong collation
#
diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test
index 94cbd71c00c..b0446e1ea4a 100644
--- a/mysql-test/t/union.test
+++ b/mysql-test/t/union.test
@@ -641,7 +641,7 @@ drop table t1;
create table t2 (
a char character set latin1 collate latin1_swedish_ci,
-b char character set latin1 collate latin1_bin);
+b char character set latin1 collate latin1_german1_ci);
--error 1271
create table t1 as
(select a from t2) union
diff --git a/sql/item.cc b/sql/item.cc
index 3b87e5ee2cf..ffde92c4214 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -474,8 +474,17 @@ bool DTCollation::aggregate(DTCollation &dt, uint flags)
set(0, DERIVATION_NONE);
return 1;
}
+ if (collation->state & MY_CS_BINSORT)
+ {
+ return 0;
+ }
+ else if (dt.collation->state & MY_CS_BINSORT)
+ {
+ set(dt);
+ return 0;
+ }
CHARSET_INFO *bin= get_charset_by_csname(collation->csname,
- MY_CS_BINSORT,MYF(0));
+ MY_CS_BINSORT,MYF(0));
set(bin, DERIVATION_NONE);
}
}