Bug #30126 ADD_DROP_DATABASE with mysqldump problem
Submitted: 30 Jul 2007 17:14 Modified: 23 Oct 2007 16:24
Reporter: Theo Groß Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Backup Severity:S3 (Non-critical)
Version:5.0.45 OS:Linux
Assigned to: Gleb Shchepa CPU Architecture:Any
Tags: mysqldump --add-drop-database

[30 Jul 2007 17:14] Theo Groß
Description:
mysqldump output of the DROP DATABASE line corrupts the dump because the line is not terminated with a semicolon.

How to repeat:
I created a full dump with the latest Version of mysqldump an added the 
--add-drop-database Comand-Line-Switch. 
[on a Mysql 4.0.24 Server]
mysqldump --add-drop-database [...] > dump.sql

When trying to restore the dump with the command:

mysql[...] < dump.sql

After adding this switch I got the following error Message:

ERROR 1064 (42000) at line 15: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*/
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `databasename`' at line 1

So something is wrong there.

Without the --add-drop-database switch this line worked perfectly for me.
So i looked closer to the output and found:

/*!40000 DROP DATABASE IF EXISTS `databasename`;*/

before that CREATE DATABASE line.	
A very close look discovered that the "*/" ist outside of the "semicolon" [;]
on other Lines with "/*" "*/" the ";[semicolon]" is the trailing character of that line. 

Suggested fix:
First i used "sed" to change the Position of the [Semicolon] but then i realised, that a fix in the source-code would be very easy [I am using the source anyway all the time]. 

So changing the Line in the source-file of mysqldump i.e. mysqldump.c
which results in the following patch

--- mysqldump.c 2007-07-30 19:09:58.000000000 +0200
+++ mysqldump.c.patched 2007-07-30 19:09:45.000000000 +0200
@@ -2872,7 +2872,7 @@
       /* Old server version, dump generic CREATE DATABASE */
       if (opt_drop_database)
         fprintf(md_result_file,
-                "\n/*!40000 DROP DATABASE IF EXISTS %s;*/\n",
+                "\n/*!40000 DROP DATABASE IF EXISTS %s*/;\n",
                 qdatabase);
       fprintf(md_result_file,
               "\nCREATE DATABASE /*!32312 IF NOT EXISTS*/ %s;\n",
[1 Aug 2007 16:12] MySQL Verification Team
Thank you for the bug report.
[24 Aug 2007 17:59] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/33045

ChangeSet@1.2504, 2007-08-24 23:29:31+05:00, gshchepa@gleb.loc +5 -0
  Fixed bug #30126.
  When dumping database from the old (4.x) server, the mysqldump client
  inserted a delimiter sign inside special commentaries of the form:
    /*!... CREATE DATABASE IF NOT EXISTS ... ;*/
  During restoration that dump file was splitten by delimiter signs on
  the client side, and the rest of some commentary strings was prepended
  to following statements.
[24 Aug 2007 20:01] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/33055

ChangeSet@1.2504, 2007-08-25 01:35:10+05:00, gshchepa@gleb.loc +5 -0
  Fixed bug #30126.
  When dumping database from the 4.x server, the mysqldump client
  inserted a delimiter sign inside special commentaries of the form:
    /*!... CREATE DATABASE IF NOT EXISTS ... ;*/
  During restoration that dump file was splitten by delimiter signs on
  the client side, and the rest of some commentary strings was prepended
  to following statements.
[25 Aug 2007 16:51] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/33105

ChangeSet@1.2504, 2007-08-25 22:26:08+05:00, gshchepa@gleb.loc +5 -0
  Fixed bug #30126.
  When dumping database from a 4.x server, the mysqldump client
  inserted a delimiter sign inside special commentaries of the form:
    /*!... CREATE DATABASE IF NOT EXISTS ... ;*/
  During restoration that dump file was splitten by delimiter signs on
  the client side, and the rest of some commentary strings was prepended
  to following statements.
[31 Aug 2007 12:01] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/33524

ChangeSet@1.2504, 2007-08-31 16:59:07+05:00, gshchepa@gleb.loc +5 -0
  Fixed bug #30126.
  When dumping database from a 4.x server, the mysqldump client
  inserted a delimiter sign inside special commentaries of the form:
    /*!... CREATE DATABASE IF NOT EXISTS ... ;*/
  During restoration that dump file was splitten by delimiter signs on
  the client side, and the rest of some commentary strings was prepended
  to following statements.
  
  The 4x_server_emul test case option has been added for use with the
  DBUG_EXECUTE_IF debugging macro. This option affects debug server
  builds only to emulate particular behavior of a 4.x server for
  the mysqldump client testing. Non-debugging builds are not affected.
[14 Sep 2007 7:45] Bugs System
Pushed into 5.1.23-beta
[14 Sep 2007 7:46] Bugs System
Pushed into 5.0.50
[23 Oct 2007 16:24] Paul DuBois
Noted in 5.0.50, 5.1.23 changelogs.

When mysqldump wrote DROP DATABASE statements within version-specific
comments, it included the terminating semicolon in the wrong place,
causing following statements to fail when the dump file was reloaded.