From 451e423be4b20057b131555b3c687637728b9963 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Tue, 10 Feb 2004 21:34:25 +0200 Subject: [PATCH] Fixes for bugs #2508 and #2552 --- mysql-test/r/union.result | 36 ++++++++++++++++++++++++++++++------ mysql-test/t/union.test | 9 +++++++++ sql/sql_class.h | 4 ++-- sql/sql_select.cc | 4 ++++ sql/sql_union.cc | 4 ++++ 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 4a514e3dd18..bdcfee97d48 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -539,7 +539,7 @@ aa show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` char(2) NOT NULL default '' + `a` char(2) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1 SELECT 12 as a UNION select "aa" as a; @@ -550,7 +550,7 @@ aa show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` char(2) NOT NULL default '' + `a` char(2) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1 SELECT 12 as a UNION select 12.2 as a; @@ -561,7 +561,7 @@ a show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` double(4,1) NOT NULL default '0.0' + `a` double(4,1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 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); @@ -585,7 +585,7 @@ it2 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `it2` int(11) NOT NULL default '0' + `it2` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1 SELECT i from t2 UNION select f from t2; @@ -799,7 +799,7 @@ select * from t1; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `1` bigint(1) NOT NULL default '0' + `1` bigint(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1 select _latin1"test" union select _latin2"testt" ; @@ -808,7 +808,7 @@ create table t1 select _latin2"test" union select _latin2"testt" ; show create table t1; Table Create Table 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 drop table t1; create table t1 (s char(200)); @@ -869,3 +869,27 @@ show status like 'Slow_queries'; Variable_name Value Slow_queries 3 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; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 8ce4aa997fc..2ea2741a621 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -465,3 +465,12 @@ show status like 'Slow_queries'; select count(*) from t1 where a=7 union select count(*) from t1 where b=13; show status like 'Slow_queries'; 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; + diff --git a/sql/sql_class.h b/sql/sql_class.h index 7971137d848..b41dc578539 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1075,11 +1075,11 @@ public: uint hidden_field_count; uint group_parts,group_length,group_null_parts; uint quick_group; - bool using_indirect_summary_function; + bool using_indirect_summary_function, all_nulls; TMP_TABLE_PARAM() :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() { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index e4f7214ad00..3f590ba23fc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4946,6 +4946,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, tmp_from_field, group != 0,not_all_columns); if (!new_field) goto err; // Should be OOM + if (param->all_nulls) + new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join tmp_from_field++; *(reg_field++)= new_field; reclength+=new_field->pack_length(); @@ -4981,6 +4983,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, goto err; // Got OOM 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) ((Item_sum *) item)->result_field= new_field; tmp_from_field++; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 1cb01c6b3ef..bfaccc93906 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -206,6 +206,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, if (first_select->next_select()) { union_result->tmp_table_param.field_count= types.elements; + union_result->tmp_table_param.all_nulls= true; if (!(table= create_tmp_table(thd_arg, &union_result->tmp_table_param, types, (ORDER*) 0, !union_option, 1, @@ -315,6 +316,7 @@ int st_select_lex_unit::exec() if it use same tables */ uint tablenr=0; + ulong query_id= thd->query_id; for (TABLE_LIST *table_list= (TABLE_LIST*) sl->table_list.first; table_list; table_list= table_list->next, tablenr++) @@ -329,6 +331,8 @@ int st_select_lex_unit::exec() */ 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(); }