diff options
author | unknown <evgen@moonbone.local> | 2005-08-15 23:05:05 +0400 |
---|---|---|
committer | unknown <evgen@moonbone.local> | 2005-08-15 23:05:05 +0400 |
commit | def42df9feebef4d513e834cfeacf73691927110 (patch) | |
tree | 762356cfe7e6b7b4041c264bbfe2db5669a2c765 | |
parent | a875ceaf64a9701d90966e50c2fd536b05b0b5ef (diff) | |
download | mariadb-git-def42df9feebef4d513e834cfeacf73691927110.tar.gz |
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.
-rw-r--r-- | mysql-test/r/view.result | 12 | ||||
-rw-r--r-- | mysql-test/t/view.test | 12 | ||||
-rw-r--r-- | sql/sql_lex.cc | 5 |
3 files changed, 28 insertions, 1 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 2af2f06ad52..a1566fa30c2 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -2097,3 +2097,15 @@ select * from v1; f1 1 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; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index ceff7af401c..f2fe5f460e2 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -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; select * from 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; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 86e677cc8dc..bbff64e516f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -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) { + bool union_all= !union_distinct; for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) { if (sl != first_select()) { str->append(" union ", 7); - if (!union_distinct) + if (union_all) str->append("all ", 4); + else if (union_distinct == sl) + union_all= true; } if (sl->braces) str->append('('); |