summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/mysqldump.c48
-rw-r--r--mysql-test/r/mysqldump.result62
-rw-r--r--mysql-test/t/mysqldump.test13
3 files changed, 118 insertions, 5 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 207235983da..f4116253f8f 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -463,7 +463,10 @@ static void write_header(FILE *sql_file, char *db_name)
if (opt_xml)
{
fputs("<?xml version=\"1.0\"?>\n", sql_file);
- fputs("<mysqldump>\n", sql_file);
+ fputs("<mysqldump ", sql_file);
+ fputs("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"",
+ sql_file);
+ fputs(">\n", sql_file);
check_io(sql_file);
}
else if (!opt_compact)
@@ -1051,6 +1054,40 @@ static void print_xml_tag1(FILE * xml_file, const char* sbeg,
/*
+ Print xml tag with for a field that is null
+
+ SYNOPSIS
+ print_xml_null_tag()
+ xml_file - output file
+ sbeg - line beginning
+ stag_atr - tag and attribute
+ sval - value of attribute
+ send - line ending
+
+ DESCRIPTION
+ Print tag with one attribute to the xml_file. Format is:
+ <stag_atr="sval" xsi:nil="true"/>
+ NOTE
+ sval MUST be a NULL terminated string.
+ sval string will be qouted before output.
+*/
+
+static void print_xml_null_tag(FILE * xml_file, const char* sbeg,
+ const char* stag_atr, const char* sval,
+ const char* send)
+{
+ fputs(sbeg, xml_file);
+ fputs("<", xml_file);
+ fputs(stag_atr, xml_file);
+ fputs("\"", xml_file);
+ print_quoted_xml(xml_file, sval, strlen(sval));
+ fputs("\" xsi:nil=\"true\" />", xml_file);
+ fputs(send, xml_file);
+ check_io(xml_file);
+}
+
+
+/*
Print xml tag with many attributes.
SYNOPSIS
@@ -1870,7 +1907,14 @@ static void dumpTable(uint numFields, char *table)
}
}
else
- fputs("NULL", md_result_file);
+ {
+ /* The field value is NULL */
+ if (!opt_xml)
+ fputs("NULL", md_result_file);
+ else
+ print_xml_null_tag(md_result_file, "\t\t", "field name=",
+ field->name, "\n");
+ }
check_io(md_result_file);
}
}
diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index 50399c91ec9..e465760736f 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -2,7 +2,7 @@ DROP TABLE IF EXISTS t1, `"t"1`;
CREATE TABLE t1(a int);
INSERT INTO t1 VALUES (1), (2);
<?xml version="1.0"?>
-<mysqldump>
+<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="test">
<table_structure name="t1">
<field Field="a" Type="int(11)" Null="YES" Key="" Extra="" />
@@ -103,7 +103,7 @@ DROP TABLE t1;
CREATE TABLE t1(a int, b text, c varchar(3));
INSERT INTO t1 VALUES (1, "test", "tes"), (2, "TEST", "TES");
<?xml version="1.0"?>
-<mysqldump>
+<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="test">
<table_structure name="t1">
<field Field="a" Type="int(11)" Null="YES" Key="" Extra="" />
@@ -128,7 +128,7 @@ DROP TABLE t1;
CREATE TABLE t1 (`a"b"` char(2));
INSERT INTO t1 VALUES ("1\""), ("\"2");
<?xml version="1.0"?>
-<mysqldump>
+<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="test">
<table_structure name="t1">
<field Field="a&quot;b&quot;" Type="char(2)" Null="YES" Key="" Extra="" />
@@ -1436,3 +1436,59 @@ MYSQL_DUMP_DIR: Got error: 1049: Unknown database 'mysqldump_test_d' when select
MYSQL_DUMP_DIR: Got error: 1102: Incorrect database name 'mysqld\ump_test_db' when selecting the database
drop table t1, t2, t3;
drop database mysqldump_test_db;
+create table t1 (a int(10));
+create table t2 (pk int primary key auto_increment,
+a int(10), b varchar(30), c datetime, d blob, e text);
+insert into t1 values (NULL), (10), (20);
+insert into t2 (a, b) values (NULL, NULL),(10, NULL),(NULL, "twenty"),(30, "thirty");
+<?xml version="1.0"?>
+<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+<database name="test">
+ <table_data name="t1">
+ <row>
+ <field name="a" xsi:nil="true" />
+ </row>
+ <row>
+ <field name="a">10</field>
+ </row>
+ <row>
+ <field name="a">20</field>
+ </row>
+ </table_data>
+ <table_data name="t2">
+ <row>
+ <field name="pk">1</field>
+ <field name="a" xsi:nil="true" />
+ <field name="b" xsi:nil="true" />
+ <field name="c" xsi:nil="true" />
+ <field name="d" xsi:nil="true" />
+ <field name="e" xsi:nil="true" />
+ </row>
+ <row>
+ <field name="pk">2</field>
+ <field name="a">10</field>
+ <field name="b" xsi:nil="true" />
+ <field name="c" xsi:nil="true" />
+ <field name="d" xsi:nil="true" />
+ <field name="e" xsi:nil="true" />
+ </row>
+ <row>
+ <field name="pk">3</field>
+ <field name="a" xsi:nil="true" />
+ <field name="b">twenty</field>
+ <field name="c" xsi:nil="true" />
+ <field name="d" xsi:nil="true" />
+ <field name="e" xsi:nil="true" />
+ </row>
+ <row>
+ <field name="pk">4</field>
+ <field name="a">30</field>
+ <field name="b">thirty</field>
+ <field name="c" xsi:nil="true" />
+ <field name="d" xsi:nil="true" />
+ <field name="e" xsi:nil="true" />
+ </row>
+ </table_data>
+</database>
+</mysqldump>
+drop table t1, t2;
diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
index 349b1e96239..2ee7fee2802 100644
--- a/mysql-test/t/mysqldump.test
+++ b/mysql-test/t/mysqldump.test
@@ -636,3 +636,16 @@ drop table t1, t2, t3;
drop database mysqldump_test_db;
+
+#
+# Bug #9657 mysqldump xml ( -x ) does not format NULL fields correctly
+#
+
+create table t1 (a int(10));
+create table t2 (pk int primary key auto_increment,
+a int(10), b varchar(30), c datetime, d blob, e text);
+insert into t1 values (NULL), (10), (20);
+insert into t2 (a, b) values (NULL, NULL),(10, NULL),(NULL, "twenty"),(30, "thirty");
+--exec $MYSQL_DUMP --skip-comments --xml --no-create-info test
+drop table t1, t2;
+