From 1f0e9f5a5ded1cfb7640b5d6d7f697a56e8cb5b5 Mon Sep 17 00:00:00 2001
From: "svoj@mysql.com/june.mysql.com" <>
Date: Fri, 14 Mar 2008 19:38:22 +0400
Subject: [PATCH] BUG#28248 - mysqldump results with MERGE ... UNION=() cannot
 be executed

When there are no underlying tables specified for a merge table,
SHOW CREATE TABLE outputs a statement that cannot be executed. The
same is true for mysqldump (it generates dumps that cannot be
executed).

This happens because SQL parser does not accept empty UNION() clause.

This patch changes the following:
- it is now possible to execute CREATE/ALTER statement with
  empty UNION() clause.
- the same as above, but still worth noting: it is now possible to
  remove underlying tables mapping using ALTER TABLE ... UNION=().
- SHOW CREATE TABLE does not output UNION() clause if there are
  no underlying tables specified for a merge table. This makes
  mysqldump slightly smaller.
---
 mysql-test/r/merge.result | 22 ++++++++++++++++++++++
 mysql-test/t/merge.test   | 13 +++++++++++++
 sql/ha_myisammrg.cc       |  6 ++++++
 sql/sql_yacc.yy           |  2 +-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result
index 2ceae95dfca..f8ef4f23180 100644
--- a/mysql-test/r/merge.result
+++ b/mysql-test/r/merge.result
@@ -918,4 +918,26 @@ id	ref
 3	2
 4	5
 DROP TABLE t1, t2, t3;
+CREATE TABLE t1(a INT);
+CREATE TABLE m1(a INT) ENGINE=MERGE;
+SHOW CREATE TABLE m1;
+Table	Create Table
+m1	CREATE TABLE `m1` (
+  `a` int(11) default NULL
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
+DROP TABLE m1;
+CREATE TABLE m1(a INT) ENGINE=MERGE UNION=();
+SHOW CREATE TABLE m1;
+Table	Create Table
+m1	CREATE TABLE `m1` (
+  `a` int(11) default NULL
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
+ALTER TABLE m1 UNION=(t1);
+ALTER TABLE m1 UNION=();
+SHOW CREATE TABLE m1;
+Table	Create Table
+m1	CREATE TABLE `m1` (
+  `a` int(11) default NULL
+) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
+DROP TABLE t1, m1;
 End of 5.0 tests
diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test
index 35443987858..e5cc4d703f2 100644
--- a/mysql-test/t/merge.test
+++ b/mysql-test/t/merge.test
@@ -542,5 +542,18 @@ SELECT * FROM t3;
 
 DROP TABLE t1, t2, t3;
 
+#
+# BUG#28248 - mysqldump results with MERGE ... UNION=() cannot be executed
+#
+CREATE TABLE t1(a INT);
+CREATE TABLE m1(a INT) ENGINE=MERGE;
+SHOW CREATE TABLE m1;
+DROP TABLE m1;
+CREATE TABLE m1(a INT) ENGINE=MERGE UNION=();
+SHOW CREATE TABLE m1;
+ALTER TABLE m1 UNION=(t1);
+ALTER TABLE m1 UNION=();
+SHOW CREATE TABLE m1;
+DROP TABLE t1, m1;
 
 --echo End of 5.0 tests
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index 78492d2843d..b796978f352 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -602,6 +602,12 @@ void ha_myisammrg::append_create_info(String *packet)
     packet->append(STRING_WITH_LEN(" INSERT_METHOD="));
     packet->append(get_type(&merge_insert_method,file->merge_insert_method-1));
   }
+  /*
+    There is no sence adding UNION clause in case there is no underlying
+    tables specified.
+  */
+  if (file->open_tables == file->end_table)
+    return;
   packet->append(STRING_WITH_LEN(" UNION=("));
   MYRG_TABLE *open_table,*first;
 
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 04285fea227..b877a789732 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2932,7 +2932,7 @@ create_table_option:
 	    my_error(ER_WARN_DEPRECATED_SYNTAX, MYF(0), "RAID_CHUNKSIZE", "PARTITION");
 	    MYSQL_YYABORT;
 	  }
-	| UNION_SYM opt_equal '(' table_list ')'
+	| UNION_SYM opt_equal '(' opt_table_list ')'
 	  {
 	    /* Move the union list to the merge_list */
 	    LEX *lex=Lex;