Commit 196b616a authored by unknown's avatar unknown

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:
  A test case for BUG#28248.
mysql-test/t/merge.test:
  A test case for BUG#28248.
sql/ha_myisammrg.cc:
  Do not output UNION clause in SHOW CREATE TABLE, when there are
  no underlying tables defined.
sql/sql_yacc.yy:
  Make underlying table list for MERGE engine optional.
  
  As for MERGE engine empty underlying tables list is valid, it should
  be valid for the parser as well.
  
  This change is mostly needed to restore dumps made by earlier MySQL
  versions. Also with this fix it is possible to remove underlying
  tables mapping by using ALTER TABLE ... UNION=().
parent 1e8b11c6
...@@ -918,4 +918,26 @@ id ref ...@@ -918,4 +918,26 @@ id ref
3 2 3 2
4 5 4 5
DROP TABLE t1, t2, t3; 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 End of 5.0 tests
...@@ -542,5 +542,18 @@ SELECT * FROM t3; ...@@ -542,5 +542,18 @@ SELECT * FROM t3;
DROP TABLE t1, t2, 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 --echo End of 5.0 tests
...@@ -602,6 +602,12 @@ void ha_myisammrg::append_create_info(String *packet) ...@@ -602,6 +602,12 @@ void ha_myisammrg::append_create_info(String *packet)
packet->append(STRING_WITH_LEN(" INSERT_METHOD=")); packet->append(STRING_WITH_LEN(" INSERT_METHOD="));
packet->append(get_type(&merge_insert_method,file->merge_insert_method-1)); 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=(")); packet->append(STRING_WITH_LEN(" UNION=("));
MYRG_TABLE *open_table,*first; MYRG_TABLE *open_table,*first;
......
...@@ -2932,7 +2932,7 @@ create_table_option: ...@@ -2932,7 +2932,7 @@ create_table_option:
my_error(ER_WARN_DEPRECATED_SYNTAX, MYF(0), "RAID_CHUNKSIZE", "PARTITION"); my_error(ER_WARN_DEPRECATED_SYNTAX, MYF(0), "RAID_CHUNKSIZE", "PARTITION");
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| UNION_SYM opt_equal '(' table_list ')' | UNION_SYM opt_equal '(' opt_table_list ')'
{ {
/* Move the union list to the merge_list */ /* Move the union list to the merge_list */
LEX *lex=Lex; LEX *lex=Lex;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment