Commit 425ae918 authored by unknown's avatar unknown

Fixes for bugs #2508 and #2552


mysql-test/r/union.result:
  Test cases for bugs #2508 and #2552
mysql-test/t/union.test:
  Test cases for bugs #2508 and #2552
sql/sql_class.h:
  A fix for a bug #2508
sql/sql_select.cc:
  A fix for a bug #2508
sql/sql_union.cc:
  a fix for a bug #2552
parent 538e6e8c
...@@ -539,7 +539,7 @@ aa ...@@ -539,7 +539,7 @@ aa
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` char(2) NOT NULL default '' `a` char(2) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT 12 as a UNION select "aa" as a; create table t1 SELECT 12 as a UNION select "aa" as a;
...@@ -550,7 +550,7 @@ aa ...@@ -550,7 +550,7 @@ aa
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` char(2) NOT NULL default '' `a` char(2) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT 12 as a UNION select 12.2 as a; create table t1 SELECT 12 as a UNION select 12.2 as a;
...@@ -561,7 +561,7 @@ a ...@@ -561,7 +561,7 @@ a
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` double(4,1) NOT NULL default '0.0' `a` double(4,1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t2 (it1 tinyint, it2 tinyint not null, i int not null, ib bigint, f float, d double, y year, da date, dt datetime, sc char(10), sv varchar(10), b blob, tx text); create table t2 (it1 tinyint, it2 tinyint not null, i int not null, ib bigint, f float, d double, y year, da date, dt datetime, sc char(10), sv varchar(10), b blob, tx text);
...@@ -585,7 +585,7 @@ it2 ...@@ -585,7 +585,7 @@ it2
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`it2` int(11) NOT NULL default '0' `it2` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT i from t2 UNION select f from t2; create table t1 SELECT i from t2 UNION select f from t2;
...@@ -799,7 +799,7 @@ select * from t1; ...@@ -799,7 +799,7 @@ select * from t1;
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`1` bigint(1) NOT NULL default '0' `1` bigint(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 select _latin1"test" union select _latin2"testt" ; create table t1 select _latin1"test" union select _latin2"testt" ;
...@@ -808,7 +808,7 @@ create table t1 select _latin2"test" union select _latin2"testt" ; ...@@ -808,7 +808,7 @@ create table t1 select _latin2"test" union select _latin2"testt" ;
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`test` char(5) character set latin2 NOT NULL default '' `test` char(5) character set latin2 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 (s char(200)); create table t1 (s char(200));
...@@ -869,3 +869,27 @@ show status like 'Slow_queries'; ...@@ -869,3 +869,27 @@ show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 3 Slow_queries 3
drop table t1; drop table t1;
create table t1 ( RID int(11) not null default '0', IID int(11) not null default '0', nada varchar(50) not null,NAME varchar(50) not null,PHONE varchar(50) not null) engine=MyISAM;
insert into t1 ( RID,IID,nada,NAME,PHONE) values (1, 1, 'main', 'a', '111'), (2, 1, 'main', 'b', '222'), (3, 1, 'main', 'c', '333'), (4, 1, 'main', 'd', '444'), (5, 1, 'main', 'e', '555'), (6, 2, 'main', 'c', '333'), (7, 2, 'main', 'd', '454'), (8, 2, 'main', 'e', '555'), (9, 2, 'main', 'f', '666'), (10, 2, 'main', 'g', '777');
select A.NAME, A.PHONE, B.NAME, B.PHONE from t1 A left join t1 B on A.NAME = B.NAME and B.IID = 2 where A.IID = 1 and (A.PHONE <> B.PHONE or B.NAME is null) union select A.NAME, A.PHONE, B.NAME, B.PHONE from t1 B left join t1 A on B.NAME = A.NAME and A.IID = 1 where B.IID = 2 and (A.PHONE <> B.PHONE or A.NAME is null);
NAME PHONE NAME PHONE
a 111 NULL NULL
b 222 NULL NULL
d 444 d 454
NULL NULL f 666
NULL NULL g 777
drop table t1;
create table t1 ( id int, name char(10) not null, name2 char(10) not null ) engine=innodb;
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
select name2 from t1 union all select name from t1 union all select id from t1;
name2
fff
sss
ttt
first
second
third
1
2
3
drop table t1;
...@@ -465,3 +465,12 @@ show status like 'Slow_queries'; ...@@ -465,3 +465,12 @@ show status like 'Slow_queries';
select count(*) from t1 where a=7 union select count(*) from t1 where b=13; select count(*) from t1 where a=7 union select count(*) from t1 where b=13;
show status like 'Slow_queries'; show status like 'Slow_queries';
drop table t1; drop table t1;
create table t1 ( RID int(11) not null default '0', IID int(11) not null default '0', nada varchar(50) not null,NAME varchar(50) not null,PHONE varchar(50) not null) engine=MyISAM;
insert into t1 ( RID,IID,nada,NAME,PHONE) values (1, 1, 'main', 'a', '111'), (2, 1, 'main', 'b', '222'), (3, 1, 'main', 'c', '333'), (4, 1, 'main', 'd', '444'), (5, 1, 'main', 'e', '555'), (6, 2, 'main', 'c', '333'), (7, 2, 'main', 'd', '454'), (8, 2, 'main', 'e', '555'), (9, 2, 'main', 'f', '666'), (10, 2, 'main', 'g', '777');
select A.NAME, A.PHONE, B.NAME, B.PHONE from t1 A left join t1 B on A.NAME = B.NAME and B.IID = 2 where A.IID = 1 and (A.PHONE <> B.PHONE or B.NAME is null) union select A.NAME, A.PHONE, B.NAME, B.PHONE from t1 B left join t1 A on B.NAME = A.NAME and A.IID = 1 where B.IID = 2 and (A.PHONE <> B.PHONE or A.NAME is null);
drop table t1;
create table t1 ( id int, name char(10) not null, name2 char(10) not null ) engine=innodb;
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
select name2 from t1 union all select name from t1 union all select id from t1;
drop table t1;
...@@ -1075,11 +1075,11 @@ class TMP_TABLE_PARAM :public Sql_alloc ...@@ -1075,11 +1075,11 @@ class TMP_TABLE_PARAM :public Sql_alloc
uint hidden_field_count; uint hidden_field_count;
uint group_parts,group_length,group_null_parts; uint group_parts,group_length,group_null_parts;
uint quick_group; uint quick_group;
bool using_indirect_summary_function; bool using_indirect_summary_function, all_nulls;
TMP_TABLE_PARAM() TMP_TABLE_PARAM()
:copy_funcs_it(copy_funcs), copy_field(0), group_parts(0), :copy_funcs_it(copy_funcs), copy_field(0), group_parts(0),
group_length(0), group_null_parts(0) group_length(0), group_null_parts(0), all_nulls(0)
{} {}
~TMP_TABLE_PARAM() ~TMP_TABLE_PARAM()
{ {
......
...@@ -4946,6 +4946,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4946,6 +4946,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
tmp_from_field, group != 0,not_all_columns); tmp_from_field, group != 0,not_all_columns);
if (!new_field) if (!new_field)
goto err; // Should be OOM goto err; // Should be OOM
if (param->all_nulls)
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
tmp_from_field++; tmp_from_field++;
*(reg_field++)= new_field; *(reg_field++)= new_field;
reclength+=new_field->pack_length(); reclength+=new_field->pack_length();
...@@ -4981,6 +4983,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4981,6 +4983,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
goto err; // Got OOM goto err; // Got OOM
continue; // Some kindf of const item continue; // Some kindf of const item
} }
if (param->all_nulls)
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
if (type == Item::SUM_FUNC_ITEM) if (type == Item::SUM_FUNC_ITEM)
((Item_sum *) item)->result_field= new_field; ((Item_sum *) item)->result_field= new_field;
tmp_from_field++; tmp_from_field++;
......
...@@ -206,6 +206,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, ...@@ -206,6 +206,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
if (first_select->next_select()) if (first_select->next_select())
{ {
union_result->tmp_table_param.field_count= types.elements; union_result->tmp_table_param.field_count= types.elements;
union_result->tmp_table_param.all_nulls= true;
if (!(table= create_tmp_table(thd_arg, if (!(table= create_tmp_table(thd_arg,
&union_result->tmp_table_param, types, &union_result->tmp_table_param, types,
(ORDER*) 0, !union_option, 1, (ORDER*) 0, !union_option, 1,
...@@ -315,6 +316,7 @@ int st_select_lex_unit::exec() ...@@ -315,6 +316,7 @@ int st_select_lex_unit::exec()
if it use same tables if it use same tables
*/ */
uint tablenr=0; uint tablenr=0;
ulong query_id= thd->query_id;
for (TABLE_LIST *table_list= (TABLE_LIST*) sl->table_list.first; for (TABLE_LIST *table_list= (TABLE_LIST*) sl->table_list.first;
table_list; table_list;
table_list= table_list->next, tablenr++) table_list= table_list->next, tablenr++)
...@@ -329,6 +331,8 @@ int st_select_lex_unit::exec() ...@@ -329,6 +331,8 @@ int st_select_lex_unit::exec()
*/ */
setup_table_map(table_list->table, table_list, tablenr); setup_table_map(table_list->table, table_list, tablenr);
} }
for (unsigned int i=0; i < table_list->table->fields; i++)
table_list->table->field[i]->query_id= query_id;
} }
res= sl->join->optimize(); res= sl->join->optimize();
} }
......
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