mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug #6139 UNION doesn't understand collate in the column of second select
This commit is contained in:
@ -1033,3 +1033,81 @@ a
|
|||||||
No
|
No
|
||||||
aaa,bbb
|
aaa,bbb
|
||||||
drop table t1,t2,t3,t4;
|
drop table t1,t2,t3,t4;
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`test` char(4) NOT NULL default ''
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
select count(*) from t1;
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test' collate latin1_bin) union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`_latin1'test' collate latin1_bin` char(4) character set latin1 collate latin1_bin NOT NULL default ''
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
select count(*) from t1;
|
||||||
|
count(*)
|
||||||
|
3
|
||||||
|
drop table t1;
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST' collate latin1_bin) union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`test` char(4) character set latin1 collate latin1_bin NOT NULL default ''
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
select count(*) from t1;
|
||||||
|
count(*)
|
||||||
|
3
|
||||||
|
drop table t1;
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST' collate latin1_bin);
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`test` char(4) character set latin1 collate latin1_bin NOT NULL default ''
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
select count(*) from t1;
|
||||||
|
count(*)
|
||||||
|
3
|
||||||
|
drop table t1;
|
||||||
|
create table t2 (
|
||||||
|
a char character set latin1 collate latin1_swedish_ci,
|
||||||
|
b char character set latin1 collate latin1_bin);
|
||||||
|
create table t1 as
|
||||||
|
(select a from t2) union
|
||||||
|
(select b from t2);
|
||||||
|
ERROR HY000: Illegal mix of collations for operation 'UNION'
|
||||||
|
create table t1 as
|
||||||
|
(select a collate latin1_german1_ci from t2) union
|
||||||
|
(select b from t2);
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a collate latin1_german1_ci` char(1) character set latin1 collate latin1_german1_ci default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 as
|
||||||
|
(select a from t2) union
|
||||||
|
(select b collate latin1_german1_ci from t2);
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` char(1) character set latin1 collate latin1_german1_ci default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
@ -595,3 +595,58 @@ select a as a from t3 union select "1";
|
|||||||
select a as a from t4 union select a from t3;
|
select a as a from t4 union select a from t3;
|
||||||
select a as a from t1 union select a from t4;
|
select a as a from t1 union select a from t4;
|
||||||
drop table t1,t2,t3,t4;
|
drop table t1,t2,t3,t4;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6139 UNION doesn't understand collate in the column of second select
|
||||||
|
#
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
select count(*) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test' collate latin1_bin) union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
select count(*) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST' collate latin1_bin) union
|
||||||
|
(select _latin1'TeST');
|
||||||
|
show create table t1;
|
||||||
|
select count(*) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 as
|
||||||
|
(select _latin1'test') union
|
||||||
|
(select _latin1'TEST') union
|
||||||
|
(select _latin1'TeST' collate latin1_bin);
|
||||||
|
show create table t1;
|
||||||
|
select count(*) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a char character set latin1 collate latin1_swedish_ci,
|
||||||
|
b char character set latin1 collate latin1_bin);
|
||||||
|
--error 1271
|
||||||
|
create table t1 as
|
||||||
|
(select a from t2) union
|
||||||
|
(select b from t2);
|
||||||
|
create table t1 as
|
||||||
|
(select a collate latin1_german1_ci from t2) union
|
||||||
|
(select b from t2);
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
create table t1 as
|
||||||
|
(select a from t2) union
|
||||||
|
(select b collate latin1_german1_ci from t2);
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
@ -2559,7 +2559,7 @@ bool Item_type_holder::join_types(THD *thd, Item *item)
|
|||||||
(new_result_type != item_type) || (new_length > max_length) ||
|
(new_result_type != item_type) || (new_length > max_length) ||
|
||||||
(!maybe_null && item->maybe_null) ||
|
(!maybe_null && item->maybe_null) ||
|
||||||
(item_type == STRING_RESULT &&
|
(item_type == STRING_RESULT &&
|
||||||
!my_charset_same(collation.collation, item->collation.collation)))
|
collation.collation != item->collation.collation))
|
||||||
{
|
{
|
||||||
if (use_expression_type || item->type() != Item::FIELD_ITEM)
|
if (use_expression_type || item->type() != Item::FIELD_ITEM)
|
||||||
field_example= 0;
|
field_example= 0;
|
||||||
|
@ -264,6 +264,23 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Check that it was possible to aggregate all collations together.
|
||||||
|
*/
|
||||||
|
List_iterator_fast<Item> tp(types);
|
||||||
|
Item *type;
|
||||||
|
while ((type= tp++))
|
||||||
|
{
|
||||||
|
if (type->result_type() == STRING_RESULT &&
|
||||||
|
type->collation.derivation == DERIVATION_NONE)
|
||||||
|
{
|
||||||
|
my_error(ER_CANT_AGGREGATE_NCOLLATIONS, MYF(0), "UNION");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// it is not single select
|
// it is not single select
|
||||||
if (first_select->next_select())
|
if (first_select->next_select())
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user