mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix bug #10624 Views with multiple UNION and UNION ALL produce incorrect
results. st_select_lex_unit::print() was losing UNION ALL if in statement were present UNION DISTINCT. mysql-test/r/view.result: Test case for bug #10624 Views with multiple UNION and UNION ALL produce incorrect results. mysql-test/t/view.test: Test case for bug #10624 Views with multiple UNION and UNION ALL produce incorrect results. sql/sql_lex.cc: Fix bug #10624 Views with multiple UNION and UNION ALL produce incorrect results.
This commit is contained in:
@ -2097,3 +2097,15 @@ select * from v1;
|
|||||||
f1
|
f1
|
||||||
1
|
1
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
create table t1 (f1 int);
|
||||||
|
create table t2 (f1 int);
|
||||||
|
insert into t1 values (1);
|
||||||
|
insert into t2 values (2);
|
||||||
|
create view v1 as select * from t1 union select * from t2 union all select * from t2;
|
||||||
|
select * from v1;
|
||||||
|
f1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
2
|
||||||
|
drop view v1;
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -1942,3 +1942,15 @@ DROP TABLE t1,t2,t3,t4,t5;
|
|||||||
create view v1 as select timestampdiff(day,'1997-01-01 00:00:00','1997-01-02 00:00:00') as f1;
|
create view v1 as select timestampdiff(day,'1997-01-01 00:00:00','1997-01-02 00:00:00') as f1;
|
||||||
select * from v1;
|
select * from v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #10624 Views with multiple UNION and UNION ALL produce incorrect results
|
||||||
|
#
|
||||||
|
create table t1 (f1 int);
|
||||||
|
create table t2 (f1 int);
|
||||||
|
insert into t1 values (1);
|
||||||
|
insert into t2 values (2);
|
||||||
|
create view v1 as select * from t1 union select * from t2 union all select * from t2;
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -1511,13 +1511,16 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
|
|||||||
|
|
||||||
void st_select_lex_unit::print(String *str)
|
void st_select_lex_unit::print(String *str)
|
||||||
{
|
{
|
||||||
|
bool union_all= !union_distinct;
|
||||||
for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
|
for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select())
|
||||||
{
|
{
|
||||||
if (sl != first_select())
|
if (sl != first_select())
|
||||||
{
|
{
|
||||||
str->append(" union ", 7);
|
str->append(" union ", 7);
|
||||||
if (!union_distinct)
|
if (union_all)
|
||||||
str->append("all ", 4);
|
str->append("all ", 4);
|
||||||
|
else if (union_distinct == sl)
|
||||||
|
union_all= true;
|
||||||
}
|
}
|
||||||
if (sl->braces)
|
if (sl->braces)
|
||||||
str->append('(');
|
str->append('(');
|
||||||
|
Reference in New Issue
Block a user