Commit 5a425250 authored by unknown's avatar unknown
Browse files

fixed union types merging and table related metadata (BUG#8824)


mysql-test/r/func_group.result:
  new result
mysql-test/r/metadata.result:
  new result
  test of metadata of variables, unions and derived tables
mysql-test/r/union.result:
  new results
  test of union of enum
mysql-test/t/metadata.test:
  test of metadata of variables, unions and derived tables
mysql-test/t/union.test:
  test of union of enum
sql/field.cc:
  Field type merging rules added
  Fixed table name/alias returting for field made from temporary tables
sql/field.h:
  removed unned field type reporting
sql/item.cc:
  fixed bug in NEW_DATE type field creartion
  replaced mechanism of merging types of UNION
sql/item.h:
  replaced mechanism of merging types of UNION
sql/item_func.h:
  new item type to make correct field type detection possible
sql/item_subselect.cc:
  added table name parameter to prepare() to show right table alias for derived tables
sql/sql_derived.cc:
  added table name parameter to prepare() to show right table alias for derived tables
sql/sql_lex.h:
  added table name parameter to prepare() to show right table alias for derived tables
sql/sql_parse.cc:
  made function for enum/set pack length calculation
sql/sql_prepare.cc:
  added table name parameter to prepare() to show right table alias for derived tables
sql/sql_select.cc:
  new temporary table field creation by Item_type_holder
  fixed table alias for temporary table
sql/sql_union.cc:
  added table name parameter to prepare() to show right table alias for derived tables
parent 98eecc7b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -747,7 +747,7 @@ insert into t1 values (now());
create table t2 select f2 from (select max(now()) f2 from t1) a;
show columns from t2;
Field	Type	Null	Key	Default	Extra
f2	datetime			0000-00-00 00:00:00	
f2	datetime	YES		NULL	
drop table t2;
create table t2 select f2 from (select now() f2 from t1) a;
show columns from t2;
+26 −1
Original line number Diff line number Diff line
@@ -55,8 +55,33 @@ id data data
2	female	no
select t1.id from t1 union select t2.id from t2;
Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
def	test	t1	t1	id	id	1	3	1	Y	32768	0	63
def				id	id	1	4	1	Y	32768	0	63
id
1
2
drop table t1,t2;
create table t1 ( a int, b varchar(30), primary key(a));
insert into t1 values (1,'one');
insert into t1 values (2,'two');
set @arg00=1 ;
select @arg00 FROM t1 where a=1 union distinct select 1 FROM t1 where a=1;
Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
def				@arg00	@arg00	8	20	1	Y	32768	0	63
@arg00
1
select * from (select @arg00) aaa;
Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
def			aaa	@arg00	@arg00	8	20	1	Y	32768	0	63
@arg00
1
select 1 union select 1;
Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
def				1	1	8	20	1	N	32769	0	63
1
1
select * from (select 1 union select 1) aaa;
Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
def			aaa	1	1	8	20	1	N	32769	0	63
1
1
drop table t1;
+46 −11
Original line number Diff line number Diff line
@@ -655,7 +655,7 @@ f
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `f` binary(24) default NULL
  `f` varbinary(24) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT y from t2 UNION select da from t2;
@@ -666,7 +666,7 @@ y
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `y` binary(10) default NULL
  `y` varbinary(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT y from t2 UNION select dt from t2;
@@ -677,7 +677,7 @@ y
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `y` binary(19) default NULL
  `y` varbinary(19) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT da from t2 UNION select dt from t2;
@@ -699,7 +699,7 @@ testc
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `dt` binary(19) default NULL
  `dt` varbinary(19) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT dt from t2 UNION select sv from t2;
@@ -710,7 +710,7 @@ testv
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `dt` binary(19) default NULL
  `dt` varbinary(19) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT sc from t2 UNION select sv from t2;
@@ -732,7 +732,7 @@ tetetetetest
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `dt` blob
  `dt` longblob
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT sv from t2 UNION select b from t2;
@@ -755,7 +755,7 @@ tetetetetest
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `i` blob
  `i` longblob
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT sv from t2 UNION select tx from t2;
@@ -766,7 +766,7 @@ teeeeeeeeeeeest
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `sv` text
  `sv` longtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 SELECT b from t2 UNION select tx from t2;
@@ -1069,7 +1069,7 @@ create table t1 as
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 ''
  `_latin1'test' collate latin1_bin` varchar(4) character set latin1 collate latin1_bin NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
select count(*) from t1;
count(*)
@@ -1082,7 +1082,7 @@ create table t1 as
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `test` char(4) character set latin1 collate latin1_bin NOT NULL default ''
  `test` varchar(4) character set latin1 collate latin1_bin NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
select count(*) from t1;
count(*)
@@ -1095,7 +1095,7 @@ create table t1 as
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `test` char(4) character set latin1 collate latin1_bin NOT NULL default ''
  `test` varchar(4) character set latin1 collate latin1_bin NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
select count(*) from t1;
count(*)
@@ -1195,3 +1195,38 @@ a b
2	b
3	c
drop table t1;
CREATE TABLE t1 (
a ENUM('','','') character set utf8 not null default '',
b ENUM("one", "two") character set utf8,
c ENUM("one", "two")
);
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` enum('','','') character set utf8 NOT NULL default '',
  `b` enum('one','two') character set utf8 default NULL,
  `c` enum('one','two') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
insert into t1 values ('', 'one', 'one'), ('', 'two', 'one'), ('', NULL, NULL);
create table t2 select NULL union select a from t1;
show columns from t2;
Field	Type	Null	Key	Default	Extra
NULL	enum('','','')	YES		NULL	
drop table t2;
create table t2 select a from t1 union select NULL;
show columns from t2;
Field	Type	Null	Key	Default	Extra
a	enum('','','')	YES		NULL	
drop table t2;
create table t2 select a from t1 union select a from t1;
show columns from t2;
Field	Type	Null	Key	Default	Extra
a	char(1)				
drop table t2;
create table t2 select a from t1 union select c from t1;
ERROR HY000: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation 'UNION'
create table t2 select a from t1 union select b from t1;
show columns from t2;
Field	Type	Null	Key	Default	Extra
a	varchar(3)	YES		NULL	
drop table t2, t1;
+13 −0
Original line number Diff line number Diff line
@@ -34,4 +34,17 @@ select t1.id, t1.data, t2.data from t1, t2 where t1.id = t2.id order by t1.id;
select t1.id from t1 union select t2.id from t2;
drop table t1,t2;

#
# variables union and derived tables metadata test
#
create table t1 ( a int, b varchar(30), primary key(a));
insert into t1 values (1,'one');
insert into t1 values (2,'two');
set @arg00=1 ;
select @arg00 FROM t1 where a=1 union distinct select 1 FROM t1 where a=1;
select * from (select @arg00) aaa;
select 1 union select 1;
select * from (select 1 union select 1) aaa;
drop table t1;

--disable_metadata
+25 −0
Original line number Diff line number Diff line
@@ -711,3 +711,28 @@ select * from ((select * from t1 limit 1) union (select * from t1 limit 1) union
select * from ((((select * from t1))) union (select * from t1) union (select * from t1)) a;
select * from ((select * from t1) union (((select * from t1))) union (select * from t1)) a;
drop table t1;

#
# Enum merging test
#
CREATE TABLE t1 (
  a ENUM('','','') character set utf8 not null default '',
  b ENUM("one", "two") character set utf8,
  c ENUM("one", "two")
);
show create table t1;
insert into t1 values ('', 'one', 'one'), ('', 'two', 'one'), ('', NULL, NULL);
create table t2 select NULL union select a from t1;
show columns from t2;
drop table t2;
create table t2 select a from t1 union select NULL;
show columns from t2;
drop table t2;
create table t2 select a from t1 union select a from t1;
show columns from t2;
drop table t2;
-- error 1267
create table t2 select a from t1 union select c from t1;
create table t2 select a from t1 union select b from t1;
show columns from t2;
drop table t2, t1;
Loading