Commit 964c4f07 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-10052 Illegal mix of collations with DAYNAME(date_field)<>varchar_field

parent 672bbcd7
...@@ -101,3 +101,31 @@ Februar ...@@ -101,3 +101,31 @@ Februar
SELECT monthname('2001-03-01'); SELECT monthname('2001-03-01');
monthname('2001-03-01') monthname('2001-03-01')
März März
#
# MDEV-10052 Illegal mix of collations with DAYNAME(date_field)<>varchar_field
#
SET NAMES utf8;
CREATE TABLE t1 (c VARCHAR(8) CHARACTER SET latin1, d DATE);
INSERT INTO t1 VALUES ('test',now());
Warnings:
Note 1265 Data truncated for column 'd' at row 1
SET lc_time_names=ru_RU;
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<>'
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<>'
SET lc_time_names=en_US;
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
c
test
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
c
test
SET NAMES latin1;
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
c
test
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
c
test
DROP TABLE t1;
...@@ -63,3 +63,22 @@ SET lc_time_names=de_AT; ...@@ -63,3 +63,22 @@ SET lc_time_names=de_AT;
SELECT monthname('2001-01-01'); SELECT monthname('2001-01-01');
SELECT monthname('2001-02-01'); SELECT monthname('2001-02-01');
SELECT monthname('2001-03-01'); SELECT monthname('2001-03-01');
--echo #
--echo # MDEV-10052 Illegal mix of collations with DAYNAME(date_field)<>varchar_field
--echo #
SET NAMES utf8;
CREATE TABLE t1 (c VARCHAR(8) CHARACTER SET latin1, d DATE);
INSERT INTO t1 VALUES ('test',now());
SET lc_time_names=ru_RU;
--error ER_CANT_AGGREGATE_2COLLATIONS
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
--error ER_CANT_AGGREGATE_2COLLATIONS
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
SET lc_time_names=en_US;
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
SET NAMES latin1;
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
DROP TABLE t1;
...@@ -935,9 +935,8 @@ void Item_func_monthname::fix_length_and_dec() ...@@ -935,9 +935,8 @@ void Item_func_monthname::fix_length_and_dec()
{ {
THD* thd= current_thd; THD* thd= current_thd;
CHARSET_INFO *cs= thd->variables.collation_connection; CHARSET_INFO *cs= thd->variables.collation_connection;
uint32 repertoire= my_charset_repertoire(cs);
locale= thd->variables.lc_time_names; locale= thd->variables.lc_time_names;
collation.set(cs, DERIVATION_COERCIBLE, repertoire); collation.set(cs, DERIVATION_COERCIBLE, locale->repertoire());
decimals=0; decimals=0;
max_length= locale->max_month_name_length * collation.collation->mbmaxlen; max_length= locale->max_month_name_length * collation.collation->mbmaxlen;
maybe_null=1; maybe_null=1;
...@@ -1082,9 +1081,8 @@ void Item_func_dayname::fix_length_and_dec() ...@@ -1082,9 +1081,8 @@ void Item_func_dayname::fix_length_and_dec()
{ {
THD* thd= current_thd; THD* thd= current_thd;
CHARSET_INFO *cs= thd->variables.collation_connection; CHARSET_INFO *cs= thd->variables.collation_connection;
uint32 repertoire= my_charset_repertoire(cs);
locale= thd->variables.lc_time_names; locale= thd->variables.lc_time_names;
collation.set(cs, DERIVATION_COERCIBLE, repertoire); collation.set(cs, DERIVATION_COERCIBLE, locale->repertoire());
decimals=0; decimals=0;
max_length= locale->max_day_name_length * collation.collation->mbmaxlen; max_length= locale->max_day_name_length * collation.collation->mbmaxlen;
maybe_null=1; maybe_null=1;
......
...@@ -61,6 +61,8 @@ public: ...@@ -61,6 +61,8 @@ public:
grouping(grouping_par), grouping(grouping_par),
errmsgs(errmsgs_par) errmsgs(errmsgs_par)
{} {}
uint repertoire() const
{ return is_ascii ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_EXTENDED; }
}; };
/* Exported variables */ /* Exported variables */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment