Commit 81cf15ae authored by msvensson@neptunus.(none)'s avatar msvensson@neptunus.(none)

Merge neptunus.(none):/home/msvensson/mysql/mysql-5.0-maint

into  neptunus.(none):/home/msvensson/mysql/mysql-5.1-new-maint
parents 55e293a5 c7710510
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <m_string.h> #include <m_string.h>
#include <m_ctype.h> #include <m_ctype.h>
#include <hash.h> #include <hash.h>
#include <stdarg.h>
#include "client_priv.h" #include "client_priv.h"
#include "mysql.h" #include "mysql.h"
...@@ -536,6 +537,8 @@ static void write_header(FILE *sql_file, char *db_name) ...@@ -536,6 +537,8 @@ static void write_header(FILE *sql_file, char *db_name)
if (opt_xml) if (opt_xml)
{ {
fputs("<?xml version=\"1.0\"?>\n", sql_file); fputs("<?xml version=\"1.0\"?>\n", sql_file);
/* Schema reference. Allows use of xsi:nil for NULL values and
xsi:type to define an element's data type. */
fputs("<mysqldump ", sql_file); fputs("<mysqldump ", sql_file);
fputs("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", fputs("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"",
sql_file); sql_file);
...@@ -1136,7 +1139,7 @@ static char *quote_for_like(const char *name, char *buff) ...@@ -1136,7 +1139,7 @@ static char *quote_for_like(const char *name, char *buff)
SYNOPSIS SYNOPSIS
print_quoted_xml() print_quoted_xml()
output - output file xml_file - output file
str - string to print str - string to print
len - its length len - its length
...@@ -1173,34 +1176,63 @@ static void print_quoted_xml(FILE *xml_file, const char *str, ulong len) ...@@ -1173,34 +1176,63 @@ static void print_quoted_xml(FILE *xml_file, const char *str, ulong len)
/* /*
Print xml tag with one attribute. Print xml tag. Optionally add attribute(s).
SYNOPSIS SYNOPSIS
print_xml_tag1() print_xml_tag(xml_file, sbeg, send, tag_name, first_attribute_name,
..., attribute_name_n, attribute_value_n, NullS)
xml_file - output file xml_file - output file
sbeg - line beginning sbeg - line beginning
stag_atr - tag and attribute
sval - value of attribute
send - line ending send - line ending
tag_name - XML tag name.
first_attribute_name - tag and first attribute
first_attribute_value - (Implied) value of first attribute
attribute_name_n - attribute n
attribute_value_n - value of attribute n
DESCRIPTION DESCRIPTION
Print tag with one attribute to the xml_file. Format is: Print XML tag with any number of attribute="value" pairs to the xml_file.
sbeg<stag_atr="sval">send
Format is:
sbeg<tag_name first_attribute_name="first_attribute_value" ...
attribute_name_n="attribute_value_n">send
NOTE NOTE
sval MUST be a NULL terminated string. Additional arguments must be present in attribute/value pairs.
sval string will be qouted before output. The last argument should be the null character pointer.
All attribute_value arguments MUST be NULL terminated strings.
All attribute_value arguments will be quoted before output.
*/ */
static void print_xml_tag1(FILE * xml_file, const char* sbeg, static void print_xml_tag(FILE * xml_file, const char* sbeg, const char* send,
const char* stag_atr, const char* sval, const char* tag_name,
const char* send) const char* first_attribute_name, ...)
{ {
va_list arg_list;
char *attribute_name, *attribute_value;
fputs(sbeg, xml_file); fputs(sbeg, xml_file);
fputs("<", xml_file); fputc('<', xml_file);
fputs(stag_atr, xml_file); fputs(tag_name, xml_file);
fputs("\"", xml_file);
print_quoted_xml(xml_file, sval, strlen(sval)); va_start(arg_list, first_attribute_name);
fputs("\">", xml_file); attribute_name= first_attribute_name;
while (attribute_name != NullS)
{
attribute_value= va_arg(arg_list, char *);
DBUG_ASSERT(attribute_value != NullS);
fputc(' ', xml_file);
fputs(attribute_name, xml_file);
fputc('\"', xml_file);
print_quoted_xml(xml_file, attribute_value, strlen(attribute_value));
fputc('\"', xml_file);
attribute_name= va_arg(arg_list, char *);
}
va_end(arg_list);
fputc('>', xml_file);
fputs(send, xml_file); fputs(send, xml_file);
check_io(xml_file); check_io(xml_file);
} }
...@@ -1410,6 +1442,28 @@ static uint dump_events_for_db(char *db) ...@@ -1410,6 +1442,28 @@ static uint dump_events_for_db(char *db)
} }
/*
Print hex value for blob data.
SYNOPSIS
print_blob_as_hex()
output_file - output file
str - string to print
len - its length
DESCRIPTION
Print hex value for blob data.
*/
static void print_blob_as_hex(FILE *output_file, const char *str, ulong len)
{
/* sakaik got the idea to to provide blob's in hex notation. */
char *ptr= str, *end= ptr + len;
for (; ptr < end ; ptr++)
fprintf(output_file, "%02X", *((uchar *)ptr));
check_io(output_file);
}
/* /*
dump_routines_for_db dump_routines_for_db
-- retrieves list of routines for a given db, and prints out -- retrieves list of routines for a given db, and prints out
...@@ -1857,7 +1911,8 @@ static uint get_table_structure(char *table, char *db, char *table_type, ...@@ -1857,7 +1911,8 @@ static uint get_table_structure(char *table, char *db, char *table_type,
if (!opt_xml) if (!opt_xml)
fprintf(sql_file, "CREATE TABLE %s (\n", result_table); fprintf(sql_file, "CREATE TABLE %s (\n", result_table);
else else
print_xml_tag1(sql_file, "\t", "table_structure name=", table, "\n"); print_xml_tag(sql_file, "\t", "\n", "table_structure", "name=", table,
NullS);
check_io(sql_file); check_io(sql_file);
} }
...@@ -2429,8 +2484,8 @@ static void dump_table(char *table, char *db) ...@@ -2429,8 +2484,8 @@ static void dump_table(char *table, char *db)
rownr=0; rownr=0;
init_length=(uint) insert_pat.length+4; init_length=(uint) insert_pat.length+4;
if (opt_xml) if (opt_xml)
print_xml_tag1(md_result_file, "\t", "table_data name=", table, "\n"); print_xml_tag(md_result_file, "\t", "\n", "table_data", "name=", table,
NullS);
if (opt_autocommit) if (opt_autocommit)
{ {
fprintf(md_result_file, "set autocommit=0;\n"); fprintf(md_result_file, "set autocommit=0;\n");
...@@ -2484,7 +2539,7 @@ static void dump_table(char *table, char *db) ...@@ -2484,7 +2539,7 @@ static void dump_table(char *table, char *db)
field->type == MYSQL_TYPE_LONG_BLOB || field->type == MYSQL_TYPE_LONG_BLOB ||
field->type == MYSQL_TYPE_MEDIUM_BLOB || field->type == MYSQL_TYPE_MEDIUM_BLOB ||
field->type == MYSQL_TYPE_TINY_BLOB)) ? 1 : 0; field->type == MYSQL_TYPE_TINY_BLOB)) ? 1 : 0;
if (extended_insert) if (extended_insert && !opt_xml)
{ {
if (i == 0) if (i == 0)
dynstr_set(&extended_row,"("); dynstr_set(&extended_row,"(");
...@@ -2573,18 +2628,25 @@ static void dump_table(char *table, char *db) ...@@ -2573,18 +2628,25 @@ static void dump_table(char *table, char *db)
{ {
if (opt_xml) if (opt_xml)
{ {
print_xml_tag1(md_result_file, "\t\t", "field name=", if (opt_hex_blob && is_blob && length)
field->name, ""); {
/* Define xsi:type="xs:hexBinary" for hex encoded data */
print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
field->name, "xsi:type=", "xs:hexBinary", NullS);
print_blob_as_hex(md_result_file, row[i], length);
}
else
{
print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
field->name, NullS);
print_quoted_xml(md_result_file, row[i], length); print_quoted_xml(md_result_file, row[i], length);
}
fputs("</field>\n", md_result_file); fputs("</field>\n", md_result_file);
} }
else if (opt_hex_blob && is_blob && length) else if (opt_hex_blob && is_blob && length)
{ {
/* sakaik got the idea to to provide blob's in hex notation. */
char *ptr= row[i], *end= ptr + length;
fputs("0x", md_result_file); fputs("0x", md_result_file);
for (; ptr < end ; ptr++) print_blob_as_hex(md_result_file, row[i], length);
fprintf(md_result_file, "%02X", *((uchar *)ptr));
} }
else else
unescape(md_result_file, row[i], length); unescape(md_result_file, row[i], length);
...@@ -2595,8 +2657,8 @@ static void dump_table(char *table, char *db) ...@@ -2595,8 +2657,8 @@ static void dump_table(char *table, char *db)
char *ptr= row[i]; char *ptr= row[i];
if (opt_xml) if (opt_xml)
{ {
print_xml_tag1(md_result_file, "\t\t", "field name=", print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
field->name, ""); field->name, NullS);
fputs(!my_isalpha(charset_info, *ptr) ? ptr: "NULL", fputs(!my_isalpha(charset_info, *ptr) ? ptr: "NULL",
md_result_file); md_result_file);
fputs("</field>\n", md_result_file); fputs("</field>\n", md_result_file);
...@@ -3070,7 +3132,7 @@ static int dump_all_tables_in_db(char *database) ...@@ -3070,7 +3132,7 @@ static int dump_all_tables_in_db(char *database)
if (init_dumping(database, init_dumping_tables)) if (init_dumping(database, init_dumping_tables))
return 1; return 1;
if (opt_xml) if (opt_xml)
print_xml_tag1(md_result_file, "", "database name=", database, "\n"); print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
if (lock_tables) if (lock_tables)
{ {
DYNAMIC_STRING query; DYNAMIC_STRING query;
...@@ -3153,7 +3215,7 @@ static my_bool dump_all_views_in_db(char *database) ...@@ -3153,7 +3215,7 @@ static my_bool dump_all_views_in_db(char *database)
if (init_dumping(database, init_dumping_views)) if (init_dumping(database, init_dumping_views))
return 1; return 1;
if (opt_xml) if (opt_xml)
print_xml_tag1(md_result_file, "", "database name=", database, "\n"); print_xml_tag(md_result_file, "", "\n", "database", "name=", database, NullS);
if (lock_tables) if (lock_tables)
{ {
DYNAMIC_STRING query; DYNAMIC_STRING query;
...@@ -3292,7 +3354,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables) ...@@ -3292,7 +3354,7 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
/* We shall countinue here, if --force was given */ /* We shall countinue here, if --force was given */
} }
if (opt_xml) if (opt_xml)
print_xml_tag1(md_result_file, "", "database name=", db, "\n"); print_xml_tag(md_result_file, "", "\n", "database", "name=", db, NullS);
/* Dump each selected table */ /* Dump each selected table */
for (pos= dump_tables; pos < end; pos++) for (pos= dump_tables; pos < end; pos++)
......
...@@ -264,7 +264,7 @@ enum enum_commands { ...@@ -264,7 +264,7 @@ enum enum_commands {
Q_IF, Q_IF,
Q_DISABLE_PARSING, Q_ENABLE_PARSING, Q_DISABLE_PARSING, Q_ENABLE_PARSING,
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST, Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -345,6 +345,8 @@ const char *command_names[]= ...@@ -345,6 +345,8 @@ const char *command_names[]=
"copy_file", "copy_file",
"perl", "perl",
"die", "die",
/* Don't execute any more commands, compare result */
"exit",
0 0
}; };
...@@ -5429,7 +5431,7 @@ void mark_progress(struct st_command* command __attribute__((unused)), ...@@ -5429,7 +5431,7 @@ void mark_progress(struct st_command* command __attribute__((unused)),
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
struct st_command *command; struct st_command *command;
my_bool q_send_flag= 0; my_bool q_send_flag= 0, abort_flag= 0;
uint command_executed= 0, last_command_executed= 0; uint command_executed= 0, last_command_executed= 0;
char save_file[FN_REFLEN]; char save_file[FN_REFLEN];
MY_STAT res_info; MY_STAT res_info;
...@@ -5549,7 +5551,7 @@ int main(int argc, char **argv) ...@@ -5549,7 +5551,7 @@ int main(int argc, char **argv)
open_file(opt_include); open_file(opt_include);
} }
while (!read_command(&command)) while (!read_command(&command) && !abort_flag)
{ {
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
if (command->type == Q_UNKNOWN || command->type == Q_COMMENT_WITH_COMMAND) if (command->type == Q_UNKNOWN || command->type == Q_COMMENT_WITH_COMMAND)
...@@ -5777,8 +5779,13 @@ int main(int argc, char **argv) ...@@ -5777,8 +5779,13 @@ int main(int argc, char **argv)
die("Parsing is already enabled"); die("Parsing is already enabled");
break; break;
case Q_DIE: case Q_DIE:
/* Abort test with error code and error message */
die("%s", command->first_argument); die("%s", command->first_argument);
break; break;
case Q_EXIT:
/* Stop processing any more commands */
abort_flag= 1;
break;
case Q_RESULT: case Q_RESULT:
die("result, deprecated command"); die("result, deprecated command");
......
...@@ -3235,6 +3235,28 @@ UNLOCK TABLES; ...@@ -3235,6 +3235,28 @@ UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
DROP TABLE t1; DROP TABLE t1;
# Bug #19745: mysqldump --xml produces invalid xml
#
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (f1 int(10), data MEDIUMBLOB);
INSERT INTO t1 VALUES(1,0xff00fef0);
<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="test">
<table_structure name="t1">
<field Field="f1" Type="int(10)" Null="YES" Key="" Extra="" />
<field Field="data" Type="mediumblob" Null="YES" Key="" Extra="" />
</table_structure>
<table_data name="t1">
<row>
<field name="f1">1</field>
<field name="data" xsi:type="xs:hexBinary">FF00FEF0</field>
</row>
</table_data>
</database>
</mysqldump>
DROP TABLE t1;
#
create table t1 (a text , b text); create table t1 (a text , b text);
create table t2 (a text , b text); create table t2 (a text , b text);
insert t1 values ("Duck, Duck", "goose"); insert t1 values ("Duck, Duck", "goose");
......
...@@ -518,4 +518,6 @@ hello ...@@ -518,4 +518,6 @@ hello
mysqltest: At line 1: Max delimiter length(16) exceeded mysqltest: At line 1: Max delimiter length(16) exceeded
hello hello
hello hello
mysqltest: At line 1: test of die
Some output
End of tests End of tests
...@@ -1414,6 +1414,21 @@ insert into t1 values (0815, 4711, 2006); ...@@ -1414,6 +1414,21 @@ insert into t1 values (0815, 4711, 2006);
DROP TABLE `t1`; DROP TABLE `t1`;
--enable_warnings --enable_warnings
--echo #
--echo # Bug #19745: mysqldump --xml produces invalid xml
--echo #
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (f1 int(10), data MEDIUMBLOB);
INSERT INTO t1 VALUES(1,0xff00fef0);
--exec $MYSQL_DUMP --xml --hex-blob --skip-create-options test t1
DROP TABLE t1;
--echo # --echo #
--echo # End of 5.0 tests --echo # End of 5.0 tests
--echo # --echo #
......
...@@ -1548,5 +1548,19 @@ perl; ...@@ -1548,5 +1548,19 @@ perl;
print "hello\n"; print "hello\n";
EOF EOF
# ----------------------------------------------------------------------------
# test for die
# ----------------------------------------------------------------------------
--error 1
--exec echo "die test of die;" | $MYSQL_TEST 2>&1
# ----------------------------------------------------------------------------
# test for exit
# ----------------------------------------------------------------------------
--exec echo "echo Some output; exit; echo Not this;" | $MYSQL_TEST 2>&1
--echo End of tests --echo End of tests
--skip-external-locking --force-restart
...@@ -241,6 +241,7 @@ THD::THD() ...@@ -241,6 +241,7 @@ THD::THD()
// Must be reset to handle error with THD's created for init of mysqld // Must be reset to handle error with THD's created for init of mysqld
lex->current_select= 0; lex->current_select= 0;
start_time=(time_t) 0; start_time=(time_t) 0;
time_after_lock=(time_t) 0;
current_linfo = 0; current_linfo = 0;
slave_thread = 0; slave_thread = 0;
variables.pseudo_thread_id= 0; variables.pseudo_thread_id= 0;
......
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