summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2005-08-15 23:05:05 +0400
committerunknown <evgen@moonbone.local>2005-08-15 23:05:05 +0400
commitdef42df9feebef4d513e834cfeacf73691927110 (patch)
tree762356cfe7e6b7b4041c264bbfe2db5669a2c765
parenta875ceaf64a9701d90966e50c2fd536b05b0b5ef (diff)
downloadmariadb-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.result12
-rw-r--r--mysql-test/t/view.test12
-rw-r--r--sql/sql_lex.cc5
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('(');